1.qss文件的读取不需要 头文件
QFile file(“xxx.qss”);
if(file.open(QFile::ReadOnly)){
QTextStream stylein(&file);
QString style=stylein.ReadAll();
file.close();
}
a.setStyleSheet(style);
2.跨窗口信号
send.h
signals:void sendms();
send.cpp
emit sendms();
receive.h
send.h//包含信号头文件
private :send *xx;//定义信号窗口对象
private slots:void change();//接收信号槽函数声明
receive.cpp
connect(xx,SIGNAL(sendms()),this,SLOT(change()));//链接信号与槽
receive::change(){xxxxxxxxxx};//定义槽函数
3.QSettings
生成的文本有三种格式:
配置文件格式:QSettings::IniFormat
注册表格式:NativeFormat,生成的文件在注册表路径下
QSettings::NativeFormat//在win平台读取win注册表
HKEY_CURRENT_USER\Software\aaa//aaa是自定义注册表的名字,前面的是路径
//使用常量字符串来指定保存的注册表位置
QSettings settings(“HKEY_CURRENT_USER\Software\aaa”,QSettings::NativeFormat);
使用方法:qsettings mysetting = new qsettings
mysetting( 存放路径,格式)
mysetting.setvalue(string,qvariant)
4.事件过滤器
事件过滤器可以对需要的组件接收到的事件进行过滤,以及监控
任意的QObject对象都可以作为事件过滤器使用
事件过滤器的实现,需要重写eventFilter()函数
bool QObject::eventFilter(对象(QObject *ob),事件(QEvent *e))
{
if(ob=?)if(e=?)
}
组件要想被监控,则需要通过installEventFilter()安装事件过滤器
ob->installEventFilter(this);
跟正则表达式有点类似
事件过滤器,用来监控某个部件的事件
比如监控某个窗体下的文本编辑控件,第一步在构造函数为文本编辑控件安装事件过滤器
ui->textEdit->installEventFilter(this);//第一步
第二步编写该窗体的事件过滤函数
bool Widget::eventFilter(QObject *watched, QEvent event);//第二步
QWheelEvent * wheelEvent = static_cast<QWheelEvent>(event);//第三步:将event强制转换为发生的事件类型
5.菜单栏编辑
private:
QAction *openfile;
QMenu *filemenu;
QToolBar *edittoolbar;
openfile=new QAction(“&Open”,this);//菜单名字
openfile->setShortcut(QKeySequence::Open);//添加快捷键ctrl+o
openfile->setStatusTip(tr(“open a new spreadsheet file”));//注释
//connect(openfile,SIGNAL(triggered()),this,SLOT(newfile()));
filemenu=menuBar()->addMenu(tr(“file”));
filemenu->addAction(openfile);
filetoolbar=addToolBar(tr(“&filetool”));
filetoolbar->addAction(newfile);
filetoolbar->addAction(openfile);
6.Qt 图形视图框架 -----绘制,控制,检测图形.
QGraphicsScence:场景,场景用于控制视图项,分三层(图形项层,前景层,背景层),可以连接多个视图
QGraphicsView:视图,可见部分
QGraphiceItem:视图项,图形的基类用于绘画,处理事件,碰撞检测
使用方法:先定义一个sence(场景)–>为场景添加视图项(sence.additem(x))–>定义视图添加场景view.setscene(&x)–>显示视图view.show()
自定义图形,就要重写视图项的两个虚函数
两个纯虚公共函数:boundingRect()和paint(),前者用来返回要绘制图形项的矩形区域,后者用来执行实际的绘图操作。
QGraphicsItem 是 Qt之图形视图框架 的一部分。
QGraphicsSimpleTextItem:提供了一个简单的文本标签项
QGraphicsTextItem:提供了一个格式化的文本项
QGraphicsLineItem:提供了一个直线项
QGraphicsPixmapItem:提供了一个图像项
QGraphicsRectItem:提供了一个矩形项
QGraphicsEllipseItem:提供了一个椭圆项
QGraphicsPathItem:提供了一个路径项
QGraphicsPolygonItem:提供了一个多边形项
exe签名流程
1.在沃通申请代码签名证书,得到文件(pfx+ms,pvk+spc)
2.解压pfx+ms文件得到ms_xs.cet,ms_xs_ws.crt,沃通证书.pfx
3.使用signtool签名
请先将您的证书XXX.pfx文件放到签名signtool工具所在目录
使用cmd打下面命令
签名命令行为:signtool sign /v /f xxx.pfx /p 密码 /tr http://timestamp.wosign.com/rfc3161 test.cab
qreal其实就是double类型;而在嵌入设备系统中,qreal则等同于float 类型。
vs调试:f9添加断点,若没有事执行到断点,断点会有黄色箭头,f10继续检查下去.
beyondcompare使用:直接选中文件与左侧比较,再去选择左侧文件
二维图形:
Qpainter绘画
先注册绘画事件函数,再在函数里定义画笔,填充,拖拉效果
image:使用与qt无关的绘画引擎重写painevent事件
基于项的视图模型
打印
拖放:同一程序或者多个程序之间传递信息的一种直观的现代操作方式(数据的移动和复制)
以QMineData类为基础
项视图类()
用于搜素,查看,编辑属于某个数据集中的个别项(item view class)
MVC
模型model,数据集查看获取数据,不同数据集有不同的模型,但是模型提供给视图的API是相同的
QSqlTableModel,QStringListModel,QDirModel…等 不同的数据类型
视图view,代表的是面向用户的那些数据,大数据集中有限的可见部分
tableview,listview,treeview就是展示数据的视图工具,决定以什么方式呈现
控制器controller,上面两个的媒介,把用户操作转换为浏览或者编辑数据的请求(qt中称为委托)
建立视图与模型之间的关系
//模型和视图的结合使用
第一步:确定模型(model)的种类,QFileSystemModel(),QStringListModel()…
模型的根路径:model.setRootPath(xxxxxxxx);
第二步:确定视图(View)种类,table,list,tree
第三步:建立视图和模型的联系(view.model(&model))
第四步:确定视图的开头索引号view.setRootIndex(model.index(xxxxxx));
注意:因为模型在ui画不出来,所以在头文件定义模型和视图控件,在cpp实现,纯代码,不用涉及画图
容器类
连续容器:连续的存储项,QVector向量,QLinkedList链表,QList数组
QVector向量:跟数组差不多物理地址都是连续的,但是可以重新定义大小
QVector<数据类型>vect(个数)
vect.count()=总个数,vect[i]=第i个数的值
追加可以用.append(xxx),也可以<<xx
迭代器iterator可以控制链表的插入和删除
关联容器:存储键值对,QMap<K,T>,QHash<K,T>
网络设置:
udp:
一.创建一个udp对象—>sender=new QUdpSocket(this);
二:填写发送的消息QByteArray datagram=datasend.toAscii();
三填写写入链接函数sender->writeDatagram(datagram.data(),QHostAddress::LocalHost,ports.toInt());
一:创建udp套接字
二:绑定端口和主句号:client->bind(45454,QUdpSocket::ShareAddress);
三:链接填好信息就可以接受的槽函数
connect(client, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
四:填写槽函数做接收处理
QByteArray datagram;
client->readDatagram(datagram.data(), datagram.size(), &sender, &sendderport);
ui.textEdit->setText(datagram);
tcp:
explicit:显示声明,在构造函数只有一个参数时,或者多个参数第一个参数没有默认值,后面的参数有默认值的情况下起作用
取消默认的隐式转换,只有参数有符合要求的才可以创造对象。
singleton:单信号实例,保证不能被同时调用
qrdir::separator//转换不同系统的反斜杠
切割窗口
QSplitter class
TerminateProcess:win的api接口终止程序进程
TerminatepProcess(GetCurrentProcess(),-1);
GetCurrentProcess();获取当前进程
6.qstyle
每个窗口都可以设置样式:setstyle(),默认继承主程序,style()继承主程序的,可以通过绘制画笔参数,传入绘制函数进行修改
主程序设置样式:application::setstyle();
与qss区别,style可以重画控件(画骨)qss只可以改表面(画皮)
QStyleFactory::Create(“xxx”),创建一个xxx类型的QStyle
QApplication::style()->metaObject()->className()//返回当前系统的样式名称
qstyle接口可以重写绘制函数:drawComplexControl//重写绘制复杂控件
drawControl//绘制一般控件
drawPrimitive//绘制最基本的控件,比如小箭头
7.qt调用shell语法
QProcess:execute(“ls”)
system(“ls”)
QProcess *process = new QProcess;process->start(“ls”);//不会阻塞线程
当命令中存在管道(|)和重定向(>)时,只能使用第二种,第一种和第三种属于Qt自身的,不能识别这两种符号。
重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;ls >file 输出到file,echo <file 读取file
而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。echo 密码| sudo -S 命令
8.栅格布局,多个参数可以设置合并单元
setwidget(行,列,行合并多少,列合并多少)
9.友元类
10.菜单大小设置,只可以设置内外边距来控制
QMenu{
background:rgba(255,255,255,1);
border:none;
}
QMenu::item{
padding:11px 32px;
color:rgba(51,51,51,1);
font-size:12px;
}
QMenu::item:hover{
background-color:#409CE1;
}
QMenu::item:selected{
background-color:#409CE1;
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
11.qt中的枚举变量
Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他
Q_ENUM,Q_ENUMS:此宏将一个或多个枚举类型注册到元对象系统。//This macro registers one or several enum types to the meta-object system.
1. 经宏定义的枚举类型,可以定义一个元对象进行调用,QMetaEnum m = QMetaEunm::fromtype<类::枚举名>
m.keyToValue,m.valueToKey,m.keyCount();,m.name();
2. 可以直接作为一个已定义的变量当形参实参使用
(注意事项,定义的结构体必须是公有类型)
Q_FLAG:修饰经QEUNM修饰过的枚举结构体,使得枚举内的变量可以参与""或""运算
enum Orientation
{
Up = 1,
Down = 2,
Left = 4,
Right = 8,
};
Q_ENUM(Orientation)
Q_DECLARE_FLAGS(OrientationFlags, Orientation)//定义标志
Q_FLAG(OrientationFlags)//把定义的flags注册到元对象系统
Q_DECLARE_OPERATORS_FOR_FLAGS(MyEnum::OrientationFlags)//声明可以进行""或""运算
11.队列
在头文件中声明: QQueue q;
q.isEmpty(); //返回队列是否为空
q.size(); //返回队列元素个数
q.clear(); //清空队列
q.enqueue(); //在队列尾部添加一个元素,比如q.enqueue("string");
q.dequeue(); //删除当前队列第一个元素,并返回这个元素
q.head(); //返回当前队列第一个元素
q.last(); //返回当前队列尾部的元素
12编码,字符转换
char(多字节字符)string 多字节 、 wchar_t(宽字节字符) wstring unicode
当设置为Use Multi-Byte Character Set时,会有预编译宏:_MBCS
当设置为Use Unicode Character Set时,会有预编译宏:_UNICODE、UNICODE
_T()、_Text()宏即L”“//包含头文件tchar.h
ALT字符转换
USES_CONVERSION; // 只需要调用一次,就可以在函数中进行多次转换
char a[12] = "china";
::MessageBoxW( NULL, A2W(a), L"", MB_ICONASTERISK|MB_TASKMODAL|MB_OK );
LPWSTR->LPTSTR: W2T();
LPTSTR->LPWSTR: T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();
ANSI->UNICODE: A2W();
UNICODE->ANSI: W2A();
QString args = QString::fromLocal8Bit("汉字2ABC");
std::wstring wlpstrstd = args.toStdWString();
LPCWSTR lpcwStr = wlpstrstd.c_str();
13.拷贝复制函数
qt的类默认没有构造函数和赋值函数,所以赋值不能直接用=/()
拷贝构造函数在四种情况下被调用:
1、对象以值传递的方式传入函数参数
f(a)
2、对象以值传递的方式从函数返回
a f(x){return a}
3、新建一个对象并将其初始化为同类现有对象
Drived d1;
Drived d2(d1);
Drived d2 = d1;
默认参数类型是类本身的函数,意思是复制了一个自己
浅拷贝没有分配内存,只是把值复制过来(复制除stastic外的数值)
析构时会导致删除同一个内存导致崩溃
阻止方法:
1.重写构造函数
2.使用智能指针计数
shared_ptr
3.使用不带构造函数和赋值操作符的基类
template <typename T> class CSingleton
{
protected:
CSingleton(){};
private://声明为私有,外界不可以调用
CSingleton(const CSingleton&){};//禁止拷贝
CSingleton& operator=(const CSingleton&){};//禁止赋值
static T* m_instance;
public:
static T* GetInstance();
~CSingleton(){
delete m_instance;
}
};
深拷贝会重新分配一个内存存放值
14.类模板
是为了实现多态,适应不同参数类型的需求
//声明一个使用类模板的函数
template
void outputArray(T * x, int y)
//此时T相当于一个任意类型的数据类型,实参传进来是什么数据类型,就变成什么数据类型
{
cout <<x+y<< endl ;
}
//使用带有模板声明的函数
int x;
outputArray(x,y)
char x;
outputArray(x,y)
string x;
outputArray(x,y)
15.通过注册文件,获取安装路径
const QString Reg_Key_Apple_Application_Support = “HKEY_LOCAL_MACHINE\SOFTWARE\Apple Inc.\Apple Application Support”;
QString installDir = QSettings(Reg_Key_Apple_Application_Support, QSettings::NativeFormat).value(“InstallDir”).toString();
//获取commonx86的路径,有则返回到appleSupportDir
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES_COMMONX86,NULL,SHGFP_TYPE_CURRENT,appleSupportDir)
//获取commonx的路径,有则返回到appleSupportDir
SHGetFolderPath(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,SHGFP_TYPE_CURRENT,appleSupportDir);
QString ZZ = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
16.qt透明设置
setAttribute(Qt::WA_StyledBackground);//作为嵌入窗口,设置该属性,避免继承父窗口属性
背景透明
setWindowsFalgs(Qt::FramelessWindowHint)//背景透明只能设置在无边框窗口
setAtrribute(Qt::WA_TransluentBackground);
设置整个窗口透明(包含控件)
setWindowOpcity();
//只在子窗口的绘画事件中才起作用
QPalette palette1 = palette();
palette1.setColor(backgroundRole(), QColor(0x00, 0x00, 0xff, 0x20));
setPalette(palette1)
17 .foreach 为for的加强版,可以用来循坏未知循环次数,主要用来对结构体的循环,可以只对其中一个进行检查
用法:foreach (定义循环的类型type x) ,被查找的集合(list))
{
x->x1 ==1;
}