QT GUI编程
Posted 子羽丿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT GUI编程相关的知识,希望对你有一定的参考价值。
QT GUI编程
- 一、QT基础
- 二、窗口部件
- 三、主窗口
- 四、事件及图形系统
- 五、文件处理
- 六、线程及同步互斥
- 七、进程与进程间的通信
- 八、补充必备
- 九、QT编写项目作品大全!
- 跳转:上一篇、C++编程!
- 跳转:下一篇、ARM体系结构!
统一声明:
博客转载 声 明 : 本博客部分内容来源于网络、书籍、及各类手册。
内容宗旨为方便查询、总结备份、开源分享。
部分转载内容均有注明出处,如有侵权请联系博客告知并删除,谢谢!
百度云盘提取码:统一提取码:ziyu
Qt编程(★★★★★推荐) 最新更新+强化+个人网站:http://www.baiziqing.cn/index.php/archives/26/
一、QT基础
1.1、QT简介
1.1.1. 什么是QT
- 一堆C++/python类库(GUI类,network,。。。。。。)
- 免费开源
1.1.2、QT特点:
- 优良的跨平台特性:
Qt支持下列操作系统: Windows、 Linux、 Solaris、Sun0sS、 FreebSD、BSD/S、SCO、AIX、0S390、QNX、 android等等 - 面向对象
-QT的良好封装机制使得Qt的模块化程度非常高,可重用性较 - 丰富的API
Qt包括多达500个以上的C++ - 大量的开发文档
Network/XML/Open GL/Database/webkit/
1.2、QT应用范围
KDE
ava
Google earth
0pera浏览器
Skype网络电话
QCad
Adobe Photoshop Album
CGAL计算几何库
…
下面展示qt部分应用领域,转至博主feiyangqingyun,如有侵权,请联系博主删除,谢谢!
雷达模拟仿真工具
数字化工厂信息
视频监控系统
人脸识别综合应用(在线+离线+嵌入式)
地图综合应用
气体安全管理系统
Onvif搜索和云台控制工具
。。。
1.3、开发环境
- 可视化工具: Qt Designer、 Qt Assistant.、 Qt Linguist、 Qt Creator
- 命令行程序: update、 release、 qmake、uic、moc
- Qt SDK开发包
- Qvfd
1.4、QT软件下载安装教程
1.4.1、QT软件下载
QT版本官方下载地址: http://download.qt.io/archive/qt/
百度云盘分享下载链接: https://pan.baidu.com/s/1T-csDlc0B_C4EY7BYP-3mA 提取码:zllk
阿里云盘分享下载链接: https://www.aliyundrive.com/s/F8Zw2Qdf6yK
1.4.2、QT软件安装
安装Linux-windows版本可参考链接:https://blog.csdn.net/qq_23473839/article/details/80523318
- 详细windows版本安装教程如下:
QT软件安装完毕!
1.5、QT内存管理
1.5.1、使用new和 delete时,内存在堆中分配。
堆内存空间必须通过 delete完全释放,以防止内存泄漏。只要不 delete,分配在堆上的对象可以一直存活下去。
栈是系统自动分配管理的,局部变量就是来自于栈区,只要超出了作用域的栈区数据就会被自动回收。
1.6、第一个QT程序
1.6.1、创建工程
三种基础模板(QWidget/ QDialog/ QMainWindow)
三种基础模板区别可参考链接:https://www.pianshen.com/article/20181654761/
工程创建完毕!
1.6.2、第一个程序
#include <QPushButton> //调用按钮头文件
/*选择组合*/
QPushButton *bt; //这里构造一个指针
可参考设置RGB颜色对照表:https://bj.96weixin.com/tools/rgb
this->setFixedSize(640, 480); //设置页面
bt = new QPushButton("登录", this); //构造一个按钮对象
bt->setGeometry(300, 400, 100, 50); //设置按钮坐标
//bt->setStyleSheet("QPushButtoncolor:blue;;"); //设置风格;设置字体颜色蓝色
//bt->setStyleSheet("QPushButtonbackground-color:blue;;"); //设置风格;设置登录框背景显示蓝色
bt->setStyleSheet("QPushButtonbackground-color:#63B8FF;;"); //设置风格;设置登录可以根据颜色码表设置颜色蓝色
第一个程序示例代码链接:
是untitled1文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
1.7、打印跟踪
1.8、QT工程示例
1.8.1、基础模板(QWidget/QDialog/QMainWindow)
1.8.2、流程1.申明界面上的元素;2.构造所需的控件;3.排版;4.前后台挂接
1.8.3、细节:
(1) 排版
- 垂直QVBoxLayout
- 水平QHBoxLayout
- 网格(二维数组)QGridLayout
(2) 信号与槽
- public slots: 申明槽函数
- Connect(发信号的对象, 信号, 接收信号的对象, 槽函数);
编程示例1:
显示对话框
#include <QPushButton> //调用按钮头文件
#include <QLineEdit> //行编辑器
/*选择组合*/
QPushButton *bt; //这里构造一个指针
QLineEdit *le; //行编辑器
#include "QVBoxLayout" //排版的垂直类
//1. 在堆区真正的将对象申请出来
bt = new QPushButton("登录", this); //构造一个按钮对象
le = new QLineEdit; //构造一个对话框
//2. 做必要的排版
QVBoxLayout *vbox = new QVBoxLayout; //垂直布局
vbox->addWidget(le); //行编辑框
vbox->addWidget(bt); //按钮
this->setLayout(vbox); //显示当前主界面
编程示例1-2代码链接:
在untitled2文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
编程示例2:
读:点击按钮电脑自动播报语音
#include <QPushButton> //调用按钮头文件
#include <QLineEdit> //行编辑器
#include <QDebug> //打印跟踪
#include <QTextToSpeech> //说话的类;需要在pro加入语言转换类:texttospeech
/*读*/
public slots: //申明此函数为槽函数(能被信号激发);QT c++语法
void xxx()
x->say("你好"); //说话的类,语言输出你好
qDebug() << "xxxxxxxxxxxx"; //显示打印xxxxxxxxxxxx
/*选择组合*/
QPushButton *bt; //这里构造一个指针
QLineEdit *le; //行编辑器
QTextToSpeech *x; //说话的类
QT += core gui texttospeech
#include "QVBoxLayout" //排版的垂直类
//1. 在堆区真正的将对象申请出来
bt = new QPushButton("读", this); //构造一个按钮对象
le = new QLineEdit; //构造一个对话框
x = new QTextToSpeech; //构造一个说话的类
//2. 做必要的排版
QVBoxLayout *vbox = new QVBoxLayout; //垂直布局
vbox->addWidget(le); //行编辑框
vbox->addWidget(bt); //按钮
this->setLayout(vbox); //显示当前主界面
//3. 前后台挂接(连接信号与曹)
connect(bt, SIGNAL(clicked(bool)), this, SLOT(xxx())); //按钮连接的信号;如果按钮按下了那么下面xxx应该点击执行
x->say(le->text()); //说话的类,编辑框中的文字
编程示例1-2代码链接:
在untitled2文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
编程示例3:
水平布局 || 网格状布局
#include <QHBoxLayout> //排版 水平布局
QHBoxLayout *hbox = new QHBoxLayout; //水平布局
hbox->addWidget(le); //行编辑框
hbox->addWidget(bt); //按钮
this->setLayout(hbox); //显示当前主界面
#include <QGridLayout> //排版 网格状布局
QGridLayout *gbox = new QGridLayout; //网格状布局
gbox->addWidget(le, 0, 0, 1, 2); //行编辑框
gbox->addWidget(bt, 1, 1, 1, 1); //按钮
setLayout(gbox);
编程示例3代码链接:
在untitled3文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
编程示:多个按钮控制
//提取发信号的对象
QPushButton *xbt = static_cast<QPushButton *>(sender());
qDebug()<<xbt->text();
编程示例:多个按钮控制链接:
在untitled3文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
1.9、QT 图形编程
1.9.1、建立工程:
1.9.2、工程实现:
QT += core gui texttospeech
#include <QTextToSpeech> //说话的类;需要在pro加入语言转换类:texttospeech
QTextToSpeech *x; //说话的类
x = new QTextToSpeech; //构造一个说话的类
x->say("吃饭了嘛"); //说出一句话
x->say(ui->lineEdit->text()); //提取框中文字语音播报
QT图形编程示例代码链接:
在untitled4文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
1.10、信号与槽
1.10.1、信号与槽
- 信号和槽机制是Qt的一个主要特征,是Qt与其它工具包最不相同的部分
- 回调( callback)是一个函数指针,当一个事件发生时被调用,任何函数都可以被安排作为回调
- 信号和槽的方式更加动态
- Qt采用信号和槽实现对象部件之间的通信。
1.10.2、信号与槽:信号
- 当信号被发射时,QT代码将回调与其相连接的槽函数
- 信号将由元对象处理moc自动翻译成C++代码
- 信号的声明不在cpp文件中,而在头文件中
1.10.3、信号与槽:槽函数
- 槽函数是普通的C++成员函数,可以被正常调用
- 槽函数可以有返回值,也可以没有
- 槽函数的访问权限三种: public slots、 private slots和 protected
slots。槽函数的存取权限决定了谁能够与其相关联
1.10.4、信号与槽:连接
1.10.5、信号与槽:发送信号
- signa-般是在事件处理时候Qt发出,如果需要程序自己触发信号,则使用emit。
- 使用语法如下
emit signal
1.10.6、信号与槽:取消连接
1.11、QT实现心仪的计算器
示例1:
实现心仪的计算器代码链接:
在实现心仪计算器示例1文件夹:https://pan.baidu.com/s/1bFNXYteY4hFqZlTTgdjkrA
提取码:rmm8
示例2:
实现心仪的计算器代码链接:
在实现心仪计算器示例2文件夹:https://pan.baidu.com/s/1bFNXYteY4hFqZlTTgdjkrA
提取码:rmm8
1.12、将QT文件单独提取出来自由使用
QT加载库程序 + 自己文件名
windeployqt.exe untitled4.exe
由于本方法打包程序文件较大,我们需要的是单独的.exe运行程序,详情见本文末尾 8.4、应用程序打包
二、窗口部件
2.1、常用类介绍
2.2、对话框(qt组合部件)
- 文件对话框( QFile Dialog)
- 消息对话框( QMessageBox)
- 输入对话框( QInputDialog)
- 颜色对话框( QColorDialog)
- 字体对话框( QFontDialog)
源码地址文件名Dialog链接:https://pan.baidu.com/s/1NOilm4D4UfOwGQwR9TH0ow
取件码:9iy1
界面:
#include <QPushButton>
#include <QTextEdit>
#include <QErrorMessage>
//QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, QProgressDialog
QPushButton *bt_filename;
QPushButton *bt_getcolor;
QPushButton *bt_getfont;
QPushButton *bt_getinput;
QPushButton *bt_message;
QPushButton *bt_error;
QPushButton *bt_progress;
QTextEdit *te_test;
#include "widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFileDialog>
#include <QColorDialog>
#include <QFontDialog>
#include <QInputDialog>
#include <QErrorMessage>
#include <QMessageBox>
#include <QProgressDialog>
bt_filename = new QPushButton("获取文件名");
bt_getcolor = new QPushButton("获取颜色");
bt_getfont = new QPushButton("获取字体");
bt_getinput = new QPushButton("获取输入");
bt_error = new QPushButton("错误弹框");
bt_message = new QPushButton("消息弹框");
bt_progress = new QPushButton("进度条对话框");
te_test = new QTextEdit;
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_filename);
vbox->addWidget(bt_getcolor);
vbox->addWidget(bt_getfont);
vbox->addWidget(bt_getinput);
vbox->addWidget(bt_error);
vbox->addWidget(bt_message);
vbox->addWidget(bt_progress);
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addLayout(vbox);
hbox->addWidget(te_test);
setLayout(hbox);
2.2.1、文件对话框( QFileDialog)
//文件对话框示例
connect(bt_filename, &QPushButton::clicked, [&]()
//提取单个文件名的对话框
// QString filename = QFileDialog::getOpenFileName();
// te_test->append(filename);
//提取多个文件名的对话框
QStringList filenames = QFileDialog::getOpenFileNames(this, "打开图片", ".", "Images (*.png *.xpm *.jpg)");
for(int i=0; i<filenames.length(见***.com/questions/ask,到目前为止你的努力是什么?
您是否阅读过QDateTimeEdit,请在您的问题中显示您用于访问数据库和插入数据的代码。表格的定义也会对您有所帮助。
【参考方案1】:
另一种方法是不将其转换为 QString,而是让驱动程序为您执行此操作。如果您希望转换有一定的精度,在某些情况下可能会更好,在其他情况下可能会更糟:
QDateTime date = ui->dateTimeEdit->dateTime();
QSqlQuery query(myDatabase);
query.prepare("INSERT INTO my_table (id, date) "
" VALUES (:id, :date)");
query.bindValue(":id", 1001);
query.bindValue(":date", date);
query.exec();
QSqlQuery::bindValue() 函数将获取 QDateTime 并将其作为 QVariant
传递,然后驱动程序应该知道如何将 QVariant::DateTime 转换为数据库可以理解的正确字符串。
【讨论】:
【参考方案2】:
关于第二部分“如何获取值”:
您以某种方式在代码中创建了 QDateTimeEdit 对象并将其放置在某个布局上。通常它将是带有名称的指针,例如 mpDTPicker。
QDateTimeEdit * mpDTPicker = new QDateTimeEdit();
//place mpDTPicker on layout.
要访问当前时间,我们需要使用方法dateTime:
//User actions with date -> emitted signal -> execute slot with our logic
QDateTime momentum = mpDTPicker->dateTime();
// So here we need convert QDateTime to QString and we will use [toString Method](http://doc.qt.io/qt-4.8/qdatetime.html#toString)
QString result_string = momentum.toString("dd:mm:yy");
QDebug() << result_string;
这就是将 QDateTime 转换为 QString 的全部内容。
关于问题的第一部分如何让用户更改 DateTimeEdit 的值是另一个问题。
关于第三部分如何将其存储在 mysql 数据库中,一切都取决于表的结构。但通常可以通过简单的query 解决:
QSqlQuery query;
QString mQuerry = "INSERT INTO mytable (id, date) VALUES (0, \"" +result_string "\" )";
query.exec(mQuerry);
请READ DOCS 特别是当他们很酷的时候:)
【讨论】:
以上是关于QT GUI编程的主要内容,如果未能解决你的问题,请参考以下文章