QT GUI编程

Posted 子羽丿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT GUI编程相关的知识,希望对你有一定的参考价值。

QT GUI编程

统一声明:
博客转载 声 明 : 本博客部分内容来源于网络、书籍、及各类手册。
        内容宗旨为方便查询、总结备份、开源分享。
        部分转载内容均有注明出处,如有侵权请联系博客告知并删除,谢谢!

百度云盘提取码:统一提取码: 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编程的主要内容,如果未能解决你的问题,请参考以下文章

QT中能不能调用C语言的API。linux下的

QT tcp 编程 【在线等】

在Qt编程中,如何调用C++的STL?

Qt简介

使用 Qt gui 绑定 C 代码 [重复]

Qt笔记——元对象系统