环境: QT4.8.5 for Windows(Qt Creator+MinGW)
一、写在前面:
1、深度:鉴于C/C++的功底还远远不足,个人主要精力还是学习C/C++,所以没打算继续深入研究Qt。
2、Why Qt:之前没做过界面相关的东西,也一直很好奇,那么炫的界面怎么做出来的。现在需要一个界面,也没人要求必须用微软的MFC,鉴于都要现学现用(也没人可以请教),而手边有一本半年前买的《C++ GUI QT4编程》(翻过前两章),于是决定上Qt。
3、内容:不涉及具体编码,在必要时会用代码例证。
4、实质:就一总结贴,但,也许可以帮助某些朋友呢,说不定。
1、QLabel
2、QLineEdit
3、QGroupBox
4、QDialogButtonBox
5、QPushButton
6、QProgressBar
7、QTableWidget
8、QTextBrowser
9、QDate、QTime、QTimer
10、QRegExp
11、加载硬盘上的文件
12、错误提示框
13、应用程序添加Logo、更改软件标题、禁止软件最大化、设置软件外观
(1)字体、大小、颜色
这些可以在Qt Designer中直接设置
(2)显示中文
setText(QString::fromUtf8("中文"));
(3)读取输入框的数据,输入完后在【更新日志】框中显示
例如,【远程IP】输入框中捕获了两个信号,并把两个信号连接到同一个槽上:
connect(ipLineEdit, SIGNAL(editingFinished()), this, SLOT(getIP())); connect(ipLineEdit, SIGNAL(textChanged(QString)), this, SLOT(getIP()));
editingFinished()信号发射的条件是按下Enter键或离开该编辑框,
textChanged(QString) 信号发射的条件是编辑框中内容改变
而在getIP()槽中,需要对不满足的数据进行过滤,在适当的时候,把输入值赋给程序中的变量:
void Class::getIP(void) { QString readText = ipLineEdit->text(); /* 1-get text */ QStringList list; if(readText.compare(Server_ip) != 0) { /* 2-text changed */ list = readText.split("."); if (!readText.isEmpty() && (list.count() == 4)) { /* 3- match the value format */ /* assign here */ } else { } } }
至于显示,直接调用QtextBrowser对象的append()函数即可。
对于其他编辑框,根据需要进行具体处理。
(4)正则表达式QRegExp
在输入数据时使用正则表达式对数据进行限制,可以极大简化应用程序参数检查的代码,使编程过程更加有侧重点。
针对该示例,需要加正则表达式的地方是:
|
限制条件
|
正则表达式 |
网络ip
|
1、数字、小数点
2、点分值为[0, 255]
3、小数点把ip分为4部分
|
QRegExp ip("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); 2[0-4]\\d: 200 - 249
25[0-5]: 250 - 255
[01]?\\d\\d?:0 - 199
{3}: 前面括号中的内容重复3次,至此结果格式为:xxx.xxx.xxx.
|
网络端口
|
1、纯数字
2、最大5位
|
QRegExp port("^[0-9]{1,5}$"); |
SIM
|
1、纯数字
2、11位
|
QRegExp sim("^[0-9]{1,11}$"); |
2、进度条QProgressBar:
progressBar->setMinimum(0);
progressBar->setMaximum(100);
设置进度条的最大值和最小值,之后在显示程序运行进度的时候,可以通过emit发射信号在界面线程中更新进度条的显示
3、QPushButton:
主要涉及的是改变按钮上字体的颜色:
QPalette palet = startButton->palette();
palet.setColor(QPalette::ButtonText, QColor(75, 172, 198));
startButton->setPalette(palet);
4、更新软件上的时间QDate、QTime、QTimer
通过QTimer建立一个定时器,一秒发射一次更新时间的信号,在对应槽中显示时间:
QDateTime dateTime = QDateTime::currentDateTime();timeLabel->setText(dateTime.time().toString());
5、QTextBrowser这里还是使用了Qt的信号-槽机制,因为在多线程中:
(1)初主线程外,不要从其他任何线程访问GUI界面
(2)禁止跨线程的父-子关系
有了信号-槽机制,在GUI线程更新界面也自然就水到渠成。
6、加载文件
调用静态(static)函数QFileDialog::getOpenFileName即可选择要加载的文件,该函数返回用户选择的文件名(含路径),否则返回空串(null string)。该函数同时弹出一个模态对话框(modal file dialog),供用户浏览文件。
QString initName = fileLineEdit->text(); if (initName.isEmpty()) { /* load file from currentPath */ initName = QDir::currentPath(); } /* getOpenFileName() returns an existing file selected by the user */ updateFileName = QFileDialog::getOpenFileName(this, tr("Open file"), initName); updateFileName = QDir::toNativeSeparators(CAppConfig::one.updateFileName); if (updateFileName.isEmpty()) { /* update text in the QLineEdit */ fileLineEdit->setText(CAppConfig::one.updateFileName); /* do other things */ } else { }
7、错误提示框没错!就是QMessageBox。
提出这一点,主要是基于软件的人性化考虑,它的相关内容在帮助文档中很详细:
8、应用程序添加Logo、更改软件标题QIcon icon("./logo.png");
setWindowIcon(icon);
setWindowTitle(QString::fromUtf8("软件名称V1.0"));
10、禁止软件最大化功能
setFixedSize(this->width(), this->height());四、设置软件外观Style之所以把它单独拉出来是因为,这是一个既大又宽泛的专题,除Qt本身界面之外,还可以在Qt中用Open GL绘制高级绚丽的界面,而个人并不打算就此深究(还要去学C/C++)。
而作出上图的效果,是直接把《C++ GUI QT4编程》中一个文件加到了自己的工程中。QApplication::setStyle(new BronzeStyle);
五、Qt多线程
参见另一篇:[Qt学习篇]Qthread实现多线程操作http://blog.csdn.net/u013686019/article/details/38851353http://no001.blog.51cto.com/1142339/277004/六、Qt网络编程参见另一篇:[Qt学习篇]UDP编程http://blog.csdn.net/u013686019/article/details/38658433七、说在最后
捣鼓Qt的过程中,最让赞的还是Qt的信号-槽机制,有了它好多事情就自自然然成了,用《圣经》话说:神说:“要有光!”就有了光。神说:“众水之间要有穹苍,把水和天空分开!”事就这样成了。
原文地址:http://blog.csdn.net/u013686019/article/details/38983083