QT GUI编程
- 一、QT基础
* - 1.1、QT简介
- 1.2、QT应用范围
- 1.3、开发环境
- 1.4、QT软件下载安装教程
- 1.5、QT内存管理
- 1.6、第一个QT程序
- 1.7、打印跟踪
- 1.8、QT工程示例
- 1.9、QT 图形编程
- 1.10、信号与槽
- 1.11、QT实现心仪的计算器
- 1.12、将QT文件单独提取出来自由使用
- 二、窗口部件
* - 2.1、常用类介绍
- 2.2、对话框(qt组合部件)
- 2.3、QT的内置部件
– - 2.4、实现一个简易的考试系统
- 三、主窗口
* - 3.1、基础窗口部件( QWidget)
- 3.2、布局管理器
- 3.3、主窗口( QMain Window)
- 3.4、菜单
- 3.5、工具栏
- 3.6、状态栏
- 3.7、动作
- 3.8、补充练习:QMain Window
- 四、事件及图形系统
* - 4.1、事件处理
- 4.2、2D绘图基础
- 4.3、坐标系统
- 4.4、Graphics View(图形视图)
- 4.5、事件过滤
- 4.6、练习自制一个表盘、画图工具。
- 五、文件处理
* - 5.1、QFiIe
- 5.2、读写方式
- 5.3、文本流
- 5.4、数据流
- 5.5、临时文件
- 5.6、目录
- 5.7、文件信息
- 5.8、文件监测
- 六、线程及同步互斥
* - 6.1、线程 QThread
- 6.2、线程同步互斥
- 6.3、线程同步
- 七、进程与进程间的通信
* - 7.1、进程 Qprocess
- 7.2、共享内存( Shared Memory)
- 7.3、Qt网络编程
- 7.4、QTcpSocket
- 7.5、QUdpSocket
- 7.6、Qt数据库编程 QSqlDatabase
- 八、补充必备
* - 8.1、国际化
- 8.2、应用程序图标
- 8.3、QSS
- 8.4、应用程序打包
- 8.5、实现一个五子棋
- 九、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 *bt;
可参考设置RGB颜色对照表:https://bj.96weixin.com/tools/rgb
this->setFixedSize(640, 480);
bt = new QPushButton("登录", this);
bt->setGeometry(300, 400, 100, 50);
bt->setStyleSheet("QPushButton{background-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
#include
QPushButton *bt;
QLineEdit *le;
#include "QVBoxLayout"
bt = new QPushButton("登录", this);
le = new QLineEdit;
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
#include
#include
#include
public slots:
void xxx()
{
x->say("你好");
qDebug() << "xxxxxxxxxxxx";
}
QPushButton *bt;
QLineEdit *le;
QTextToSpeech *x;
QT += core gui texttospeech
#include "QVBoxLayout"
bt = new QPushButton("读", this);
le = new QLineEdit;
x = new QTextToSpeech;
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le);
vbox->addWidget(bt);
this->setLayout(vbox);
connect(bt, SIGNAL(clicked(bool)), this, SLOT(xxx()));
x->say(le->text());
编程示例1-2代码链接:
在untitled2文件夹:https://pan.baidu.com/s/1_sonChu0NyJhtJkmEsRSKQ
提取码:u4uy
编程示例3:
水平布局 || 网格状布局
#include
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(le);
hbox->addWidget(bt);
this->setLayout(hbox);
#include
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 *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
#include
#include
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
#include
#include
#include
#include
#include
#include
#include
#include
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, [&](){
QStringList filenames = QFileDialog::getOpenFileNames(this, "打开图片", ".", "Images (*.png *.xpm *.jpg)");
for(int i=0; i<filenames.length(); i++)
te_test->append(filenames[i]);
});
2.2.2、颜色对话框( QColor Dialog)
connect(bt_getcolor, &QPushButton::clicked, [&](){
QColor color = QColorDialog::getColor();
te_test->setTextColor(color);
});
2.2.3、字体对话框( QFontDialog)
connect(bt_getfont, &QPushButton::clicked, [&](){
bool ok;
QFont font = QFontDialog::getFont(&ok);
if(ok)
te_test->setCurrentFont(font);
});
2.2.4、输入对话框( QInputDialog)
connect(bt_getinput, &QPushButton::clicked, [&](){
QString str = QInputDialog::getText(this, "xxxx", "yyyy");
te_test->setText(str);
});
2.2.5、消息对话框( QMessageBox)
connect(bt_message, &QPushButton::clicked, [&](){
QMessageBox::warning(this, "xxxx", "yyyyyyy", QMessageBox::Open, QMessageBox::Apply);
});
2.2.6、错误消息对话框( QErrorMessage)
connect(bt_error, &QPushButton::clicked, [&](){
QErrorMessage *x;
x->showMessage("xxxxxxxxxxxxxxxxxxx");
});
2.2.7、进度条( QProgressDialog)
connect(bt_progress, &QPushButton::clicked, [&](){
QProgressDialog x;
x.setValue(88);
x.exec();
});
2.3、QT的内置部件
(1) 排版类
(2) 常见按钮
//普通按钮
QPushButton bt_test;
//工具栏按钮
QToolButton bt_tool;
//单选按钮
QRadioButton bt_radio1, bt_radio2;
//复选按钮
QCheckBox bt_check1, bt_check2;
(3) 输出部件
//标签(文字提示, 图片显示,动画显示。。。)
QLabel lb_text;
QLabel lb_pix;
QLabel lb_gif;
//文本浏览器(解释html)
QTextBrowser tb_test;
//日历
QCalendarWidget cl_test;
//七段数码管
QLCDNumber lcd_test;
//进度条
QProgressBar *pbr_test;
(4) 输入部件类
//行编辑框
QLineEdit le_test;
QCheckBox ck_test;
//组合框
QComboBox cmb_test;
//字体选择下拉框
QFontComboBox fcb_test;
//文本编辑框
QTextEdit te_test;
//自旋框
QSpinBox sp_test;
QLCDNumber lcd_test;
//旋钮
QDial dl_test;
//滚动条
QScrollBar sbr_test;
//滑动杆儿
QSlider sd_test;
2.3.1、排版类
水平布局 || 网格状布局
#include
QHBoxLayout *hbox = new QHBoxLayout;
hbox->addWidget(le);
hbox->addWidget(bt);
this->setLayout(hbox);
#include
QGridLayout *gbox = new QGridLayout;
gbox->addWidget(le, 0, 0, 1, 2);
gbox->addWidget(bt, 1, 1, 1, 1);
setLayout(gbox);
Qt之格栅布局(QGridLayout)参考链接:https://www.cnblogs.com/ranson7zop/p/7462265.html
2.3.2、常见按钮
实现按钮链接_文件名:buttons:https://pan.baidu.com/s/1vDEm5QuXe2R360GXtRWqsg
提取码:14td
普通按钮
#include
QPushButton *bt_test;
照片放在:build-output-Desktop_Qt_5_10_1_MinGW_32bit-Debug 路径,就不需要声明路径了。
#include
bt_test = new QPushButton("ok");
bt_test->setMinimumSize(200, 100);
bt_test->setFlat(true);
bt_test->setIconSize(QSize(80, 80));
bt_test->setIcon(QIcon("car.png"));
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_test);
setLayout(vbox);
工具按钮
#include
QToolButton *bt_tool;
bt_tool = new QToolButton;
bt_tool->setIcon(QIcon("car.png"));
bt_tool->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M));
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_tool);
setLayout(vbox);
#include
bt_tool->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M));
connect(bt_tool, SIGNAL(clicked(bool)), this, SLOT(textbutton()));
void textbutton();
connect(bt_tool, SIGNAL(clicked(bool)), this, SLOT(textbutton()));
connect(bt_check1, SIGNAL(clicked(bool)), this, SLOT(check_pushed(bool)));
void Widget::textbutton()
{
qDebug()<<"xxxxxxxxxxxxxxxx";
}
单选按钮
#include
QRadioButton *bt_radio1, *bt_radio2;
bt_radio2 = new QRadioButton("可以左转");
bt_radio1 = new QRadioButton("可以右转");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_check1);
vbox->addWidget(bt_check2);
setLayout(vbox);
复选按钮
#include
QCheckBox *bt_check1, *bt_check2;
bt_check1 = new QCheckBox("显示密码");
bt_check2 = new QCheckBox("自动登录");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_check1);
vbox->addWidget(bt_check2);
setLayout(vbox);
lamda表达式(无名函数)
connect(bt_tool, &QToolButton::clicked, [&](){
qDebug()<<"yyyyyyyyyyyyyyyyyy";
});
复选按钮-判断点击上还是没点击上
void check_pushed(bool);
connect(bt_check1, SIGNAL(clicked(bool)), this, SLOT(check_pushed(bool)));
}
void Widget::check_pushed(bool x)
{
qDebug()<<"mmmmmmmmmmmmmmmmm"<<x;
}
2.3.3、输入部件类
实现输入部件类链接_文件名:input:https://pan.baidu.com/s/1vDEm5QuXe2R360GXtRWqsg
提取码:14td
行编辑框
#include
#include
QLineEdit *le_test;
QCheckBox *ck_test;
#include
le_test = new QLineEdit;
ck_test = new QCheckBox("显示密码");
le_test->setEchoMode(QLineEdit::Password);
connect(ck_test, &QCheckBox::clicked, [&](bool x){
le_test->setEchoMode(x?QLineEdit::Normal:QLineEdit::Password);
});
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(le_test);
vbox->addWidget(ck_test);
setLayout(vbox);
组合框
#include
QComboBox *cmb_test;
#include
cmb_test = new QComboBox;
cmb_test->addItem("com1");
cmb_test->addItem("com2");
cmb_test->addItem("com3");
connect(cmb_test, &QComboBox::currentTextChanged, [&](QString x){
qDebug() <<x;
});
字体选择框
#include
QFontComboBox *fcb_test;
te_test = new QTextEdit;
fcb_test = new QFontComboBox;
connect(fcb_test, &QFontComboBox::currentFontChanged, [&](QFont x){
le_test->setFont(x);
te_test->setCurrentFont(x);
});
vbox->addWidget(te_test);
文本编辑框
#include
QTextEdit *te_test;
te_test = new QTextEdit;
fcb_test = new QFontComboBox;
connect(fcb_test, &QFontComboBox::currentFontChanged, [&](QFont x){
le_test->setFont(x);
te_test->setCurrentFont(x);
});
自旋框
#include
#include
QSpinBox *sp_test;
QLCDNumber *lcd_test;
lcd_test = new QLCDNumber;
lcd_test->setMinimumHeight(50);
connect(sp_test, SIGNAL(valueChanged(int)), lcd_test, SLOT(display(int)));
vbox->addWidget(lcd_test);
设置范围
sp_test->setRange(20, 100);
旋扭
#include
QDial *dl_test;
dl_test = new QDial;
connect(dl_test, SIGNAL(valueChanged(int)), lcd_test, SLOT(display(int)));
vbox->addWidget(dl_test);
滚动条
#include
QScrollBar *sbr_test;
sbr_test = new QScrollBar;
sbr_test->setOrientation(Qt::Horizontal);
connect(sbr_test, SIGNAL(valueChanged(int)), lcd_test, SLOT(display(int)));
vbox->addWidget(sbr_test);
滑动杆
#include
QSlider *sd_test;
sd_test = new QSlider;
sd_test->setOrientation(Qt::Horizontal);
connect(sd_test, SIGNAL(valueChanged(int)), lcd_test, SLOT(display(int)));
vbox->addWidget(sd_test);
2.3.4、输出部件类
实现输入部件类链接_文件名:output:https://pan.baidu.com/s/1vDEm5QuXe2R360GXtRWqsg
提取码:14td
标签-显示文字-照片
#include
QLabel *lb_text;
QLabel *lb_pix;
QLabel *lb_gif;
lb_text = new QLabel("我是文字");
lb_text->setAlignment(Qt::AlignCenter);
lb_pix = new QLabel("我是图片");
lb_pix->setScaledContents(true);
lb_pix->setPixmap(QPixmap("1.jpg"));
lb_pix->setFixedSize(200, 120);
QVBoxLayout *vbox1 = new QVBoxLayout;
vbox1->addWidget(lb_text);
vbox1->addWidget(lb_pix);
setLayout(vbox1);
标签-显示动画
需要一张gif动图
#include
lb_gif = new QLabel;
lb_gif->setFixedSize(200, 120);
lb_gif->setScaledContents(true);
lb_gif->setAlignment(Qt::AlignCenter);
QMovie *m = new QMovie("1.gif");
lb_gif->setMovie(m);
m->start();
vbox1->addWidget(lb_gif);
文本浏览器
#include
QTextBrowser *tb_test;
tb_test = new QTextBrowser;
tb_test->setHtml("\
\
\
\
菜鸟教程(runoob.com)\
\
\
我的第一个标题\
我的第一个段落。\
\
");
vbox1->addWidget(tb_test);
lb_pix->setFixedSize(200, 120);
lb_gif->setFixedSize(200, 120);
lb_gif->setScaledContents(true);
图形视图框架
日历
#include
QCalendarWidget *cl_test;
cl_test = new QCalendarWidget;
vbox->addwidget(cl_test);
#include
#include
cl_test = new QCalendarWidget ;
connect(cl_test, &QCalendarWidget::clicked, [&](QDate x){
qDebug() << x;
lcd_test->display(x.toString());
});
vbox2->addWidget(cl_test);
七段数码管
#include
QLCDNumber *lcd_test;
lcd_test = new QLCDNumber;
lcd_test->setDigitCount(20);
lcd_test->setMinimumSize(400, 100);
lcd_test->display(1234);
cl_test = new QCalendarWidget ;
connect(cl_test, &QCalendarWidget::clicked, [&](QDate x){
qDebug() << x;
lcd_test->display(x.toString());
});
进度条
#include
QProgressBar *pbr_test;
pbr_test = new QProgressBar;
vbox2->addWidget(pbr_test);
定时器类 QTimer
#include
QTimer *t = new QTimer;
connect(t, &QTimer::timeout, [&](){
static int x = 0;
pbr_schedule->setValue(x++);
lcd_time->display(x);
});
t->start(100);
2.3.5、QT组合部件
QColorDialog, QErrorMessage, QFileDialog, QFontDialog, QInputDialog, QMessageBox, QProgressDialog, and QWizard。
2.3.6、容器类
源码地址文件名containor 链接:https://pan.baidu.com/s/1NOilm4D4UfOwGQwR9TH0ow
取件码:9iy1
==容器类GroupBox-组合框 ==
#include
QGroupBox *gb1;
QGroupBox *gb2;
#include
#include
QGroupBox *gb1 = new QGroupBox(tr("Exclusive Radio Buttons"));
QRadioButton *radio1 = new QRadioButton(tr("&Radio button 1"));
QRadioButton *radio2 = new QRadioButton(tr("R&adio button 2"));
QRadioButton *radio3 = new QRadioButton(tr("Ra&dio button 3"));
radio1->setChecked(true);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(radio1);
vbox->addWidget(radio2);
vbox->addWidget(radio3);
vbox->addStretch(1);
gb1->setLayout(vbox);
QGroupBox *gb2 = new QGroupBox(tr("Exclusive Radio Buttons"));
QRadioButton *radio11 = new QRadioButton(tr("&Radio button 11"));
QRadioButton *radio12 = new QRadioButton(tr("R&adio button 12"));
QRadioButton *radio13 = new QRadioButton(tr("Ra&dio button 13"));
radio11->setChecked(true);
QVBoxLayout *vbox1 = new QVBoxLayout;
vbox1->addWidget(radio11);
vbox1->addWidget(radio12);
vbox1->addWidget(radio13);
vbox1->addStretch(1);
gb2->setLayout(vbox1);
Scroll Area-滚动窗口容器
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QLabel *lb_pix;
};
#endif
#include "widget.h"
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
lb_pix = new QLabel;
lb_pix->setPixmap(QPixmap("1.jpg"));
QScrollArea *sl = new QScrollArea;
sl->setFixedSize(640, 480);
sl->setWidget(lb_pix);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(sl);
setLayout(vbox);
}
Widget::~Widget()
{
}
Tool Box-工具箱
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QTextEdit *te_test1;
QTextEdit *te_test2;
};
#endif
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te_test1 = new QTextEdit("xxxxxxxxxxxxxxxxx\nxxxxxxxxxx\nxxxx");
te_test2 = new QTextEdit("yyyyyyyyyyyyy\nyyyyyyyyyy\nyyyyyyyyyy");
QToolBox *tb = new QToolBox;
tb->addItem(te_test1, "xxxxx1");
tb->addItem(te_test2, "xxxxx2");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(tb);
setLayout(vbox);
}
Widget::~Widget()
{
}
TabWidget-选项卡-分页显示
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QTextEdit *te_test1;
QTextEdit *te_test2;
};
#endif
#include "widget.h"
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te_test1 = new QTextEdit("xxxxxxxxxxxxxxxxx\nxxxxxxxxxx\nxxxx");
te_test2 = new QTextEdit("yyyyyyyyyyyyy\nyyyyyyyyyy\nyyyyyyyyyy");
QTabWidget *tb = new QTabWidget;
tb->setTabsClosable(true);
tb->addTab(te_test1, "1.c");
tb->addTab(te_test2, "2.c");
connect(tb, &QTabWidget::tabCloseRequested, [&](int x){
qDebug()<<"xxx"<<x;
});
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(tb);
setLayout(vbox);
}
Widget::~Widget()
{
}
QStackedWidget-堆栈窗口类
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QTextEdit *te_test1;
QTextEdit *te_test2;
QComboBox *cb_test;
};
#endif
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te_test1 = new QTextEdit("xxxxxxxxxxxxxxxxx\nxxxxxxxxxx\nxxxx");
te_test2 = new QTextEdit("yyyyyyyyyyyyy\nyyyyyyyyyy\nyyyyyyyyyy");
QStackedWidget *tb = new QStackedWidget;
tb->addWidget(te_test1);
tb->addWidget(te_test2);
cb_test = new QComboBox;
cb_test->addItem("1.c");
cb_test->addItem("2.c");
connect(cb_test, SIGNAL(activated(int)), tb, SLOT(setCurrentIndex(int)));
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(cb_test);
vbox->addWidget(tb);
setLayout(vbox);
}
Widget::~Widget()
{
}
MdiArea-多媒体窗口
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QTextEdit *te_test1;
QTextEdit *te_test2;
};
#endif
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te_test1 = new QTextEdit("xxxxxxxxxxxxxxxxx\nxxxxxxxxxx\nxxxx");
te_test2 = new QTextEdit("yyyyyyyyyyyyy\nyyyyyyyyyy\nyyyyyyyyyy");
QMdiArea *mdi = new QMdiArea;
mdi->addSubWindow(te_test1);
mdi->addSubWindow(te_test2);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(mdi);
setLayout(vbox);
}
Widget::~Widget()
{
}
2.3.7、练习-qq登录界面、图片浏览器/抽奖系统、实现串口助手。
图片浏览器/抽奖系统
图片浏览器/抽奖系统对应文件:pix_reader.rar 链接:https://pan.baidu.com/s/1X-OROiiBIdhICkIWPc6tFA
提取码:dvp0
; 2.4、实现一个简易的考试系统
简易版,界面待优化。
实现一个简易的考试系统代码链接:https://pan.baidu.com/s/1QAme6p-QHSCmN-e3nuw2rg
提取码:b2k9
三、主窗口
3.1、基础窗口部件( QWidget)
- 基础窗口部件主要用于自定义窗
QWidge堤提供一个基础窗口,窗口并没有任何图形部件。通过指定图形部件的父对象来把图形部件放上基础窗口,或是通过自动布局工具把图形部件放上基
础窗口。
3.2、布局管理器
布局管理器主要常用的三个类: QHBoXLayout、 QVBoxLayout、 QGridLayout
- QHBOXLayout:水平布局
- QVBoxLayout:垂直布局
- QGrid Layout:网格布
3.3、主窗口( QMain Window)
QMain Window类提供了一个典型应用程序的主窗口框架,对于小屏幕设备使用Q图形设计器定义标准 Qwidget模板比使用主窗口类更好一些典型模板包含有菜单栏 QMenuBar,工具栏 TOolbAr和状态栏 STatus Bar。
3.3.1、创建工程
QMain Window示例代码链接:https://pan.baidu.com/s/1w99gg-lmuxaywJP1byFDTA
提取码:7vkv
; 3.4、菜单
QAction *actopen = new QAction("打开");
actopen->setIcon(QIcon(":/img/open.png"));
actopen->setShortcut(QKeySequence("Ctrl+O"));
QMenu *fileMenu = menuBar()->addMenu("&File");
fileMenu->addAction(actnew);
fileMenu->addAction(actopen);
void openfile();
#include
connect(actopen, SIGNAL(triggered(bool)), this, SLOT(openfile()));
void MainWindow::openfile()
{
QFileDialog::getOpenFileName();
}
资源文件的添加
先自己创建一个文件夹用于保存照片路径
qt界面 右键 添加新文件
actnew->setIcon(QIcon(":/img/new.png"));
文本编辑器
QAction *actnew = new QAction("新建");
actnew->setIcon(QIcon(":/img/new.png"));
actnew->setShortcut(QKeySequence("Ctrl+N"));
QAction *actopen = new QAction("打开");
actopen->setIcon(QIcon(":/img/open.png"));
actopen->setShortcut(QKeySequence("Ctrl+O"));
QAction *actsave = new QAction("保存");
actsave->setIcon(QIcon(":/img/save.png"));
actsave->setShortcut(QKeySequence("Ctrl+S"));
QAction *actsaveas = new QAction("另存为");
actsaveas->setIcon(QIcon(":/img/saveas.png"));
actsaveas->setShortcut(QKeySequence("Ctrl+Shift+S"));
QMenu *fileMenu = menuBar()->addMenu("&File");
fileMenu->addAction(actnew);
fileMenu->addAction(actopen);
fileMenu->addAction(actsave);
fileMenu->addAction(actsaveas);
QAction *actcopy = new QAction("复制");
actcopy->setIcon(QIcon(":/img/copy.png"));
actcopy->setShortcut(QKeySequence("Ctrl+C"));
QAction *actcut = new QAction("剪切");
actcut->setIcon(QIcon(":/img/cut.png"));
actcut->setShortcut(QKeySequence("Ctrl+X"));
QAction *actpaste = new QAction("粘贴");
actpaste->setIcon(QIcon(":/img/paste.png"));
actpaste->setShortcut(QKeySequence("Ctrl+V"));
QMenu *editMenu = menuBar()->addMenu("&Edit");
editMenu->addAction(actcopy);
editMenu->addAction(actcut);
editMenu->addAction(actpaste);
3.5、工具栏
#include
#include
QToolBar *filetool = addToolBar("文件");
filetool->addAction(actnew);
filetool->addAction(actopen);
QToolBar *edittool = addToolBar("编辑");
edittool->addAction(actcopy);
edittool->addAction(actpaste);
QToolBar *settool = addToolBar("设置");
QFontComboBox *fc = new QFontComboBox;
settool->addWidget(fc);
connect(actopen, SIGNAL(triggered(bool)), this, SLOT(openfile()));
#include
#include
QToolBar *settool = addToolBar("设置");
QFontComboBox *fc = new QFontComboBox;
settool->addWidget(fc);
添加照片
3.6、状态栏
中央部件
#include
te = new QTextEdit;
te->setMinimumSize(640, 480);
this->setCentralWidget(te);
connect(actopen, SIGNAL(triggered(bool)), this, SLOT(openfile()));
状态栏
#include
QLabel *lb = new QLabel("1.txt");
this->statusBar()->addWidget(lb);
connect(actopen, SIGNAL(triggered(bool)), this, SLOT(openfile()));
操作文件
#include
void openfile();
void MainWindow::openfile()
{
QString filename = QFileDialog::getOpenFileName();
QFile f(filename);
f.open(QIODevice::ReadOnly);
QByteArray buf = f.readAll();
f.close();
te->setText(buf);
}
3.7、动作
一般的,菜单项和工具栏按钮,往往执行一样的功能,所以Qt设讠 ACtion来管理其共有的显示图标、提示信息、热键、槽函数,等等。
3.8、补充练习:QMain Window
练习:QMain Window 代码链接:https://pan.baidu.com/s/1YrqnFoYerSH2k8mWSnaG-Q
提取码:ziyu
; 四、事件及图形系统
4.1、事件处理
Qt的事件由窗口系统或是Q自身产生,用于响应各种需要处理的事务。
- 特定事件处理器
- QObject对象事件处理器
- 事件过滤器
发送事件
处理事件
定时事件
4.1事件及图形代码文件名:event_test 链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
处理鼠标事件
public:
void mousePressEvent(QMouseEvent *event);
#include "QMouseEvent"
void Widget::mousePressEvent(QMouseEvent *event)
{
qDebug () << "mouse pos" << event->pos();
qDebug () << "mouse button" << event->button();
}
void mousePressEvent(QMouseEvent *event);
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug () << "mouse double" << event->pos();
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
qDebug () << "mouse release" << event->pos();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
qDebug () << "mouse move:" << event->pos();
}
滚轮事件
void wheelEvent(QWheelEvent *event);
#include "QWheelEvent"
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug () << event->angleDelta();
}
键盘事件
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
#include "QKeyEvent"
void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() << event->key();
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
qDebug() << event->key();
}
窗口关闭事件
void closeEvent(QCloseEvent *event);
void Widget::closeEvent(QCloseEvent *event)
{
qDebug()<<"xxxxxxxxxxxxxxxxxxx";
}
4.2、2D绘图基础
Qt的2D绘图系统主要是由于三个基本的类构成: QPainter、 QPaintEngine、 QPaintDevice。
绘图事件
void paintEvent(QPaintEvent *event);
void Widget::paintEvent(QPaintEvent *event)
{
qDebug()<<"ddddddddddddddddddddd"<<pos<<posend;
}
画点
#include
QPoint pos;
QPoint posend;
void Widget::mousePressEvent(QMouseEvent *event)
{
pos = event->pos();
qDebug()<<"mouse press: "<<event->pos();
qDebug()<<"mouse button: "<<event->button();
}
QPainter p(this);
QPen pen;
pen.setWidth(10);
p.setPen(pen);
p.drawPoint(pos);
qDebug()<<"ddddddddddddddddddddd"<<pos<<posend;
画线
p.drawLine(QPoint(0,0), pos);
QPoint posend;
void Widget::mousePressEvent(QMouseEvent *event)
{
pos = event->pos();
qDebug()<<"mouse press: "<<event->pos();
qDebug()<<"mouse button: "<<event->button()
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
posend = event->pos();
update();
qDebug()<<"mouse move:" <<event->pos();
}
p.drawLine(pos, posend);
qDebug()<<"ddddddddddddddddddddd"<<pos<<posend;
画椭圆
p.drawEllipse(posend, 100, 100);
p.drawLine(posend, QPoint(posend.x()+200, posend.y()));
画矩形
p.drawRect(posend.x(), posend.y(), 300, 200);
画刷子
QBrush brush;
brush.setColor(Qt::red);
brush.setStyle(Qt::DiagCrossPattern);
p.setBrush(brush);
画照片
p.drawPixmap(posend.x(), posend.y(), 100, 100, QPixmap("C:\\Users\\29507\\Desktop\\car.png"));
4.3、坐标系统
画家动作
QPainter p(this);
p.translate(100, 100);
p.scale(0.5, 0.5);
p.drawEllipse(QPoint(0, 0), 100, 100);
时钟
#include
angle = 0;
QTimer *t = new QTimer;
connect(t, &QTimer::timeout, [&](){
angle+=6;
update();
});
t->start(100);
#if 1
QPainter p(this);
p.translate(100, 100);
p.scale(0.5, 0.5);
p.drawEllipse(QPoint(0, 0), 100, 100);
p.rotate(angle);
p.drawLine(QPoint(0, 0), QPoint(100, 0));
p.drawText(150, 0, "hello");
#endif
4.1事件及图形代码文件名:event_test 链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
双缓冲绘图
双缓冲绘图代码文件名:doubleBuff 链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
按空格保存
照片保存在:build-doubleBuff-Desktop_Qt_5_10_1_MinGW_32bit-Debug 路径
画矩形
#ifndef WIDGET_H
#define WIDGET_H
#include
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
QPoint posstart;
QPoint posend;
QPixmap *pix;
bool ismoving;
};
#endif
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
pix = new QPixmap(640, 480);
pix->fill();
ismoving = true;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p2(this);
p2.drawPixmap(0, 0, 640, 480, *pix);
p2.drawRect(QRect(posstart, posend));
QPainter p1(pix);
if(!ismoving){
p1.drawRect(QRect(posstart, posend));
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
posstart = event->pos();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
posend = event->pos();
ismoving = true;
update();
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
ismoving = false;
update();
}
void Widget::keyPressEvent(QKeyEvent *event)
{
pix->save("1.jpg");
}
Widget::~Widget()
{
}
双缓冲绘图代码文件名:doubleBuff 链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
模仿一个按钮出来
模仿一个按钮事列代码文件名:mybutton链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
点击按钮关闭
文件代码:
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include
class myPushButton : public QWidget
{
Q_OBJECT
public:
explicit myPushButton(QString text, QWidget *parent = nullptr);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
signals:
void clicked();
private:
bool drawblack;
QString textt;
};
#endif
#ifndef WIDGET_H
#define WIDGET_H
#include
#include "mypushbutton.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
myPushButton *bt_test;
};
#endif
#include "mypushbutton.h"
#include
#include
myPushButton::myPushButton(QString text, QWidget *parent) : QWidget(parent),textt(text)
{
drawblack = false;
setMinimumSize(100, 50);
}
void myPushButton::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"ppppppppppppppppp";
drawblack = true;
update();
emit clicked();
}
void myPushButton::mouseReleaseEvent(QMouseEvent *event)
{
drawblack = false;
update();
}
void myPushButton::paintEvent(QPaintEvent *event)
{
QPainter p(this);
if(drawblack)
{
qDebug()<<"dddddddddddd";
QBrush brush;
brush.setColor(Qt::black);
brush.setStyle(Qt::DiagCrossPattern);
p.setBrush(brush);
p.drawRect(0, 0, width(), height());
}
qDebug() << textt;
p.setPen(Qt::red);
p.drawText(width()/2, height()/2, textt);
}
#include "widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
bt_test = new myPushButton("OK");
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(bt_test);
setLayout(vbox);
connect(bt_test, &myPushButton::clicked, [&](){
close();
});
}
Widget::~Widget()
{
}
模仿一个按钮事列代码文件名:mybutton链接:https://pan.baidu.com/s/1wyp-89-8HvHXOefqE5_ACg
提取码:ziyu
4.4、Graphics View(图形视图)
Graphics View支持同 QPainter-样的几何变换:缩放、平移、旋转、扭转等等功能。也可以通过 QMatrix完成几何变换的值设置。
4.5、事件过滤
事件过滤传统处理方式
事件过滤传统处理方式textZoom链接:https://pan.baidu.com/s/1TbWztC0ZAru5qKBbMiF5PA
提取码:ziyu
#ifndef WIDGET_H
#define WIDGET_H
#include
#include "mytextedit.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
myTextEdit *te;
};
#endif
#include "widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
te = new myTextEdit;
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(te);
setLayout(vbox);
}
Widget::~Widget()
{
}
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H
#include
#include
#include
class myTextEdit : public QTextEdit
{
public:
myTextEdit();
void wheelEvent(QWheelEvent *e)
{
qDebug()<<e->delta();
if(e->delta()>0)
this->setFontPointSize(size++);
else{
size -= 1;
if(0 == size)
size = 1;
this->setFontPointSize(size);
}
}
int size;
};
#endif
#include "mytextedit.h"
myTextEdit::myTextEdit()
{
size = 1;
}
事件过滤
事件过滤代码文件名textoom_pro链接:https://pan.baidu.com/s/1TbWztC0ZAru5qKBbMiF5PA
提取码:ziyu
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
#include
class Widget : public QWidget
{
Q_OBJECT
public:
bool eventFilter(QObject *watched, QEvent *event)
{
if(watched == te)
{
if(event->type() == QEvent::Wheel)
{
QWheelEvent *e = static_cast<QWheelEvent *>( event);
if(e->delta()>0)
te->setFontPointSize(size++);
else{
size -= 1;
if(0 == size)
size = 1;
te->setFontPointSize(size);
}
return true;
}
}
return false;
}
Widget(QWidget *parent = 0);
~Widget();
QTextEdit *te;
int size;
};
#endif
#include "widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
size = 1;
te = new QTextEdit;
te->installEventFilter(this);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(te);
setLayout(vbox);
}
Widget::~Widget()
{
}
4.6、练习自制一个表盘、画图工具。
自制一个表盘代码链接:https://pan.baidu.com/s/1EcrlF9igClUsiBtdgVoppw
提取码:ziyu
画图工具代码链接:https://pan.baidu.com/s/1LixaVNtv5KjJaEc4iw89lA
提取码:ziyu
; 五、文件处理
5.1、QFiIe
5.1.1、文件加密工具案例
新建文件
项目案例
void on_view_clicked();
void on_encode_clicked();
void on_exit_clicked();
Ui::Widget *ui;
QString filename;
#include "widget.h"
#include "ui_widget.h"
#include
#include
void Widget::on_view_clicked()
{
filename = QFileDialog::getOpenFileName();
ui->lineEdit->setText(filename);
}
文件加密工具案例链接地址:https://pan.baidu.com/s/1Ij9mb-5x0sQNT46ODWvmTQ
提取码:ziyu
5.2、读写方式
在 linux系统下,一切皆是文件,当打开的是设备对象时候,就会存在阻塞读写方式
- 阻塞
- 非阻塞
- 超时
详情可参考博主链接:https://www.cnblogs.com/flowingwind/p/8336159.html
5.3、文本流
Qt文本流和数据详情可参考博主链接:https://www.cnblogs.com/hjxzjp/p/12339751.html
; 5.4、数据流
QData Stream用于处理 QIODevice和 QByteArray管理的数据流。
Qt文本流和数据详情可参考博主链接:https://www.cnblogs.com/hjxzjp/p/12339751.html
5.5、临时文件
; 5.6、目录
5.7、文件信息
; 5.8、文件监测
六、线程及同步互斥
6.1、线程 QThread
6.1.1、线程案例:
(1)新建文件
(2)项目案例 – qt一个线程
#ifndef WIDGET_H
#define WIDGET_H
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void work();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
};
#endif
#include "ui_widget.h"
void Widget::work()
{
for(int i=0; i100; i++)
{
int x = 2000000;
while(x--);
ui->progressBar->setValue(i);
}
for(int i=0; i100; i++)
{
int x = 4000000;
while(x--);
ui->progressBar_2->setValue(i);
}
for(int i=0; i100; i++)
{
int x = 5000000;
while(x--);
ui->progressBar_3->setValue(i);
}
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
}
(3)项目案例 – 多线程程序设计
#ifndef MYTASK_H
#define MYTASK_H
#include
class myTask : public QThread
{
Q_OBJECT
signals:
void progress(int);
public:
myTask(int delay);
void run()
{
for(int i=0; i100; i++)
{
int x = time;
while(x--);
emit progress(i);
}
}
int time;
};
#endif
#include "mytask.h"
myTask::myTask(int delay)
:time(delay)
{
}
#include "widget.h"
#include "ui_widget.h"
#include "mytask.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myTask *t1 = new myTask(20000000);
myTask *t2 = new myTask(50000000);
myTask *t3 = new myTask(10000000);
connect(t1, SIGNAL(progress(int)), ui->progressBar, SLOT(setValue(int)));
connect(t2, SIGNAL(progress(int)), ui->progressBar_2, SLOT(setValue(int)));
connect(t3, SIGNAL(progress(int)), ui->progressBar_3, SLOT(setValue(int)));
t1->start();
t2->start();
t3->start();
}
Widget::~Widget()
{
delete ui;
}
QT多线程案例链接地址:https://pan.baidu.com/s/1FTN_onqboDz9tOSpHXzGoQ
提取码:ziyu
6.2、线程同步互斥
6.2.1、互斥锁 MUtex、 QMutexLocker
(1)新建文件
(2)创建第1个线程
#include
#include "printarrthread.h"
#include "reversarrthread.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char arr[] = "123456789";
QMutex lock;
printArrThread t(arr, &lock);
t.start();
reversArrThread t1(arr, &lock);
t1.start();
return a.exec();
}
#ifndef PRINTARRTHREAD_H
#define PRINTARRTHREAD_H
#include
#include
#include
class printArrThread : public QThread
{
Q_OBJECT
public:
printArrThread(char *arr, QMutex *lock);
void run()
{
while(1){
l->lock();
qDebug()<<t;
l->unlock();
}
}
char *t;
QMutex *l;
};
#endif
#include "printarrthread.h"
printArrThread::printArrThread(char *arr, QMutex *lock)
:t(arr), l(lock)
{
}
(2)创建第2个线程
#include
#include "printarrthread.h"
#include "reversarrthread.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char arr[] = "123456789";
QMutex lock;
printArrThread t(arr, &lock);
t.start();
reversArrThread t1(arr, &lock);
t1.start();
return a.exec();
}
#ifndef REVERSARRTHREAD_H
#define REVERSARRTHREAD_H
#include
#include
class reversArrThread : public QThread
{
public:
reversArrThread(char *arr, QMutex *lock);
void run()
{
while(1)
{
l->lock();
for(int i=0; i<9/2; i++)
{
t[i] ^= t[9-i-1];
t[9-i-1] ^= t[i];
t[i] ^= t[9-i-1];
}
l->unlock();
sleep(1);
}
}
char *t;
QMutex *l;
};
#endif
#include "reversarrthread.h"
reversArrThread::reversArrThread(char *arr, QMutex *lock)
:t(arr), l(lock)
{
}
QT互斥锁案例链接地址:https://pan.baidu.com/s/1XPk4yyW6LTAJ_gjlR8n67g
提取码:ziyu
6.2.2、读写锁 QReadWriteLock
Qt的读写锁QReadWriteLock参考链接:https://www.fearlazy.com/index.php/post/99.html
6.2.3、条件变量 QWait Condition
QWaitCondition 条件变量参考链接:https://blog.csdn.net/Amnes1a/article/details/70226207
6.2.4、信号量 SEmaphore
信号量 SEmaphore参考链接:https://www.cnblogs.com/venow/archive/2012/10/15/2724943.html
; 6.3、线程同步
6.3.1、QT线程同步案例
(1)新建文件
(2)同步实现
#include
#include "printarrthread.h"
#include "reversarrthread.h"
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char arr[] = "123456789";
QSemaphore sem;
printArrThread t(arr, &sem);
t.start();
reversArrThread t1(arr, &sem);
t1.start();
return a.exec();
}
#ifndef PRINTARRTHREAD_H
#define PRINTARRTHREAD_H
#include
#include
#include
class printArrThread : public QThread
{
Q_OBJECT
public:
printArrThread(char *arr, QSemaphore *sem);
void run()
{
while(1){
s->acquire();
printf("%s\n", t);
fflush(stdout);
}
}
char *t;
QSemaphore *s;
};
#endif
#include "printarrthread.h"
printArrThread::printArrThread(char *arr, QSemaphore *sem)
:t(arr), s(sem)
{
}
#ifndef REVERSARRTHREAD_H
#define REVERSARRTHREAD_H
#include
#include
#include
class reversArrThread : public QThread
{
public:
reversArrThread(char *arr, QSemaphore *sem);
void run()
{
while(1)
{
for(int i=0; i<9/2; i++)
{
t[i] ^= t[9-i-1];
t[9-i-1] ^= t[i];
t[i] ^= t[9-i-1];
}
sleep(1);
s->release();
}
}
char *t;
QSemaphore *s;
};
#endif
#include "reversarrthread.h"
reversArrThread::reversArrThread(char *arr, QSemaphore *sem)
:t(arr), s(sem)
{
}
QT线程同步案例代码链接地址:https://pan.baidu.com/s/1FjXuqsgPLZet8TH8WREVcA
提取码:ziyu
七、进程与进程间的通信
7.1、进程 Qprocess
Qt 进程 QProcess
如有侵权请联系博主删除!
可参考博主链接:https://blog.csdn.net/chy555chy/article/details/53119551
共享内存(Shared Memory)介绍
如有侵权请联系博主删除!
可参考博主链接:https://blog.csdn.net/WAN_EXE/article/details/56484664
7.3、Qt网络编程
Qt网络编程例子:https://blog.csdn.net/m0_37357063/article/details/80744011
7.3.1、qt实现客户端
(1)新建文件
(2)客户端实现
QT += core gui network
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void read_data();
void on_pushButton_clicked();
private:
Ui::Widget *ui;
QTcpSocket *mysock;
};
#endif
#include "widget.h"
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
mysock = new QTcpSocket;
mysock->connectToHost("192.168.7.109", 8888);
connect(mysock, SIGNAL(readyRead()), this, SLOT(read_data()));
}
void Widget::read_data()
{
QByteArray buf = mysock->readAll();
ui->textEdit->append(buf);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString str = ui->lineEdit->text();
mysock->write(str.toStdString().c_str());
}
qt实现客户端代码链接地址:https://pan.baidu.com/s/1c5et4bRr1DbBfzL9JPYIRw
提取码:ziyu
7.3.2、qt实现服务器端
(1)新建文件
(2)实现服务器端
10:00
; 7.4、QTcpSocket
Qt-网络编程之QTCPSocket和QTCPServer(实现简易网络调试助手)
如有侵权请联系博主删除!
可参考博主链接:https://www.cnblogs.com/lifexy/p/11317662.html
7.5、QUdpSocket
数据报套接字是一种没有连接不可靠网络通讯接口
QUdpSocket-Qt使用Udp通讯实现服务端和客户端
如有侵权请联系博主删除!
可参考博主链接:https://blog.csdn.net/pingis58/article/details/82977335
; 7.6、Qt数据库编程 QSqlDatabase
QT 的数据库操作(QSqlDatabase、QSqlQuery)可参考链接:https://blog.csdn.net/Zzhouzhou237/article/details/79459320
八、补充必备
8.1、国际化
Qt 加载翻译文件基本方法推荐链接:https://blog.csdn.net/weixin_38293850/article/details/89680575
8.2、应用程序图标
RC_ICONS = mycless.ico
QT 设置程序图标可参考1: https://blog.csdn.net/weixin_38293850/article/details/88420242
QT 设置程序图标可参考2: https://blog.csdn.net/xiezhongyuan07/article/details/79320523👎 error: [Makefile.Debug:72: debug/QtIcon_resource_res.o] Error 1 原因与彻底解决方案_转载:https://blog.csdn.net/weixin_42126427/article/details/106686824
推荐在线制作ico图标,ico图标转换工具:https://www.bitbug.net/
8.3、QSS
【QT】QSS美化——基础知识:https://blog.csdn.net/qq_40602000/article/details/104652131
8.4、应用程序打包
在终端里面,【ctrl】+【insert】相当于复制,【shift】+【insert】相当于粘贴,在其他操作系统的终端一样试用,例如linux
QT加载库程序 + 自己文件名
windeployqt.exe untitled4.exe
这时候我们需要一个大包软件将多个文件打包成一个可执行的应用程序!
Enigma Virtual Box是一款免费的单文件封包工具,他可以一个应用程序的多个文件打包成一个可执行的应用程序:https://blog.csdn.net/qq_28368039/article/details/115482209
百度云盘Enigma Virtual Box分享链接:https://pan.baidu.com/s/1uvddkRywzW3gxCPnqebtEA
提取码:ziyu
; 8.5、实现一个五子棋
五子棋源代码链接:https://pan.baidu.com/s/1LJkVEoVhq2rmg9nNYRpvdA
提取码:ziyu
九、QT编写项目作品大全!
Qt编写项目作品大全推荐链接:https://zhuanlan.zhihu.com/p/75489053
Qt项目视频展示bilbil推荐链接:https://www.bilibili.com/video/BV1Hr4y1T7y1?p=4
跳转:上一篇、C++编程!
跳转:下一篇、ARM体系结构!
Original: https://blog.csdn.net/qq_43498137/article/details/119278690
Author: 子羽丿
Title: QT GUI编程
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/811913/
转载文章受原作者版权保护。转载请注明原作者出处!