35. layout->addWidget(buttons[i]);
36. groupbox->setLayout(layout);
37.}
复制代码
几个知识点:
1.groupbox=newQGroupBox(tr("LayoutTest"));
LayoutTest是个文本这个无须解释
那tr呢?
查查资料知道是为了支持多语言
先知道即可以后使用的话在具体查查吧
2.QDialogButtonBox是个什么东西
看看最终的程序界面吧
原来是对话框的确认和取消按钮
再看信号槽函数无非就是绑定按钮到操作函数
connect(buttonBox,SIGNAL(accepted()),this,SLOT(accept()));
connect(buttonBox,SIGNAL(rejected()),this,SLOT(reject()));
那accepted和accept函数有啥区别?
看看文档
accept函数的解释是:
HidesthemodaldialogandsetstheresultcodetoAccepted
accpeted函数的解释是:
Thissignalisemittedwhenthedialoghasbeenacceptedeither
在说说QT皮肤
学习QT的主要目的就是想做做脸蛋好看好的软件界面
那就试试看吧
查到的QT有一个名叫QSS(CSS?
)的文件可以原来换肤
那就改改看吧
#include
#include
#include
#include
#include"dialog.h"
voidsetSkin(QApplication*constapp,QStringconst&skinFile);
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
setSkin(&app,"skin.qss");
Dialogdialog;
dialog.show();
returnapp.exec();
}
voidsetSkin(QApplication*constapp,QStringconst&skinFile)
{
QFileqss(skinFile);
qss.open(QFile:
:
ReadOnly);
app->setStyleSheet(qss.readAll());
qss.close();
}
相应的QSS文件如下:
QPushButton
{
color:
red;
background:
url(setting.png)
}
这里把PushButton的文本颜色设置为红色
同时把它的背景设置为图片stting.png
QT学习笔记-3.Codecs例子学习
QT自带的例子Codecs是一篇关于保存和载入不同编码文本的例子
其界面比较简单一个简单的单文档而已
有2个主要的对象
一个是MainWindow用于窗体主界面
另外一个是PreviewForm用于显示编码格式列表
1.其编码格式的获取
部分代码如下:
QMapcodecMap;
QRegExpiso8859RegExp("ISO[-]8859-([0-9]+).*");
foreach(intmib,QTextCodec:
:
availableMibs()){
QTextCodec*codec=QTextCodec:
:
codecForMib(mib);
QStringsortKey=codec->name().toUpper();
intrank;
if(sortKey.startsWith("UTF-8")){
rank=1;
}elseif(sortKey.startsWith("UTF-16")){
rank=2;
}elseif(iso8859RegExp.exactMatch(sortKey)){
if(iso8859RegExp.cap
(1).size()==1)
rank=3;
else
rank=4;
}else{
rank=5;
}
sortKey.prepend(QChar('0'+rank));
codecMap.insert(sortKey,codec);
}
codecs=codecMap.values();
通过使用foreach循环来获取支持的编码格式并保存
不过看上去foreach(intmib,QTextCodec:
:
availableMibs())有点奇怪
查查资料
解释是foreach(variables,container)关键字是Qt对c++的一个扩展,主要用于按顺序历经容器(container)中的对象
2关于文件菜单的生成和设置
菜单的构造
一个例子
saveAsMenu=newQMenu(tr("&SaveAs"),this);这里有2个参数一个是菜单显示文另外一个是当前窗体指针
然后就可以加载子菜单,设置分隔符,设置事件响应等操作了
例子为:
fileMenu=newQMenu(tr("&File"),this);
fileMenu->addAction(openAct);
fileMenu->addMenu(saveAsMenu);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
那如何绑定菜单到当前窗体呢
如下:
menuBar()->addMenu(fileMenu);
menuBar()->addSeparator();
menuBar()->addMenu(helpMenu);
menuBar()是QmainWindow的成员函数用于获取窗体菜单项指针
3.QT对象QAction
QT文档对QAction的解释是可以抽象用户接口对象-可以插入控件
例子如下:
openAct=newQAction(tr("&Open"),this);
openAct->setShortcuts(QKeySequence:
:
Open);
connect(openAct,SIGNAL(triggered()),this,SLOT(open()));
无非就是对象声明,设置快捷键,链接函数和响应而已
4.窗体设置
setWindowTitle(tr("Codecs"));
resize(500,400);
5.消息对话框
QMessageBox:
:
about(this,tr("AboutCodecs"),
tr("TheCodecsexampledemonstrateshowtoreadandwrite"
"filesusingvariousencodings."));
QT学习笔记-4.信号与插槽
本文主要是对C++GUIProgrammingwithQt4一书SignalsandSlotsinDepth部分的翻译
信号与插槽机制是Qt编程的基础.它可以绑定对象而不需要对象之间彼此了解。
槽类似于c++中的成员函数他可以是虚拟的,可重载的,私有的,公开的,受保护的。
不同点式槽可以链接到信号。
通过这种方式可以在每次信号发射的的时候做到调用槽函数
connect()语句是这样的
1.connect(sender,SIGNAL(signal),receiver,SLOT(slot));
复制代码
在这里sender和receiver是指向信号对象和槽对象的指针。
宏SIGNAL()和SLOTS()负责转换他们的参数到字符串。
当然一个信号可以连接到多个槽(似乎都是这样的)
1.connect(slider,SIGNAL(valueChanged(int)),
2. spinBox,SLOT(setValue(int)));
3.connect(slider,SIGNAL(valueChanged(int)),
4. this,SLOT(updateStatusBarIndicator(int)));
复制代码
同样多个信号可以连接到单个槽
例如:
1.connect(lcd,SIGNAL(overflow()),
2. this,SLOT(handleMathError()));
3.connect(calculator,SIGNAL(divisionByZero()),
4. this,SLOT(handleMathError()));
复制代码
除此之外信号可以连接到其他信号(见过的其他插槽系统似乎不大可以?
)
connect(lineEdit,SIGNAL(textChanged(constQString&)),
this,SIGNAL(updateRecord(constQString&)));
需要指出的是信号信号链接和信号插槽连接时不同的
既然信号和插槽可以连接那么他们应该可以断开,如下:
1.disconnect(lcd,SIGNAL(overflow()),
2. this,SLOT(handleMathError()));
复制代码
一个简单的例子:
1.classEmployee:
publicQObject
2.{
3. Q_OBJECT
4.public:
5. Employee(){mySalary=0;}
6. intsalary()const{returnmySalary;}
7.publicslots:
8. voidsetSalary(intnewSalary);
9.signals:
10. voidsalaryChanged(intnewSalary);
11.private:
12. intmySalary;
13.};
14.voidEmployee:
:
setSalary(intnewSalary)
15.{
16. if(newSalary!
=mySalary){
17. mySalary=newSalary;
18. emitsalaryChanged(mySalary);
19. }
20.}
21.
复制代码
说明
关键字publicslots:
和signals
他们用于修饰插槽函数和信号函数
至于信号的反射通过关键字emit来实现
通过本文基本掌握了QT的信号插槽机制
QT学习笔记-5.QT容器和算法
本文涉及QT中的容器对象系列
一容器
QVector类似stl中的vector插入尾部数据速度很快
基本例子如下:
QVectorvect(3);
vect[0]=1.0;
vect[1]=0.540302;
vect[2]=-0.416147;
这样也可以
QVectorvect;
vect.append(1.0);
vect.append(0.540302);
vect.append(-0.416147);
另外也可以通过流
vect<<1.0<<0.540302<<-0.416147;
2.QLinkedList没有提供[]操纵
随机访问速度很慢
3.QList序列容器是一种数组链表它具有前2者的大部分操作支持随机访问
在容器头部尾部插入数据很迅速
4.QStringList是QList的子类提供以下操作
排序,过滤,正则表达式处理等
5.QStack提供push,pop,top等操作
6.QueueQT的队列模板
7.QMap
基本操作如下:
QMapmap;
map.insert("eins",1);
map.insert("sieben",7);
map.insert("dreiundzwanzig",23);
当然也可以这样插入数据
map["eins"]=1;
map["sieben"]=7;
map["dreiundzwanzig"]=23;
但是这样做有一个问题那就是会生成空值
为了不出现这样的结果可以使用成员函数value()来代替[]来获取数据,如果对于键不存在则返回默认的对象值
8.QHash使用散列存储键值对
二通用算法
需要说明的是QT中的容器是stl风格的,这意味着可以使用Stl中的算法。
当然在QT库中QtAlgorithm文件包含了基本的算法模板
主要的函数有
qFind-查找给定元素在容器中的位置类似std:
:
find
qBinaryFind-类似qFind需要查找元素有序排列
qFill-类似std:
:
fill使用给定元素填充容器
qCopy,qSort..
qDeleteAll-函数对容器中的每个元素做删除处理
基本的容器和算法就这么多了
其实熟悉stl的话学习这个上手很快的
QT学习笔记-6.QApplication和基本控件的使用
接上文,这篇学学QT中基本控件的使用和QApplication对象
1.什么是QApplication?
文档说明:
TheQApplicationclassmanagestheGUIapplication'scontrolflowandmainsettings.
Application类管理GUI程序控制流和主要参数设置
QApplication继承于QCoreApplication。
后者提供了控制台程序的事件流
2.基本控件的使用例子:
#include
#include
#include
#defineQT_HTML
QLabel*label=NULL;
voidinitlabel()
{
#ifndefQT_HTML
label=newQLabel("HelloQt!
");
#else
label=newQLabel("
HelloQt!