Qt:Qt是一个跨平台的C++框架(C++库),Qt除了支持界面设计(GUI编程),还封装了与网络编程、多线程、数据库连接、视频音频等相关的功能。
ctrl 撤销(返回上一步)
市面常见的GUI库(Windows下):
基于C++的有Qt、MFC、WTL、wxWidget、DirectUI、Htmlyout
基于C#的有WinForm、WPF
基于JAVA的有AWT、Swing
…
Qt来开发桌面程序有一下优点:
简单易学:Qt 封装的很好,几行代码就可以开发出一个简单的客户端,不需要了解 Windows API。
资料丰富:资料丰富能够成倍降低学习成本,否则你只能去看源码,关于 DirectUI、Htmlayout、aardio 的资料就很少。
漂亮的界面:Qt 很容易做出漂亮的界面和炫酷的动画,而 MFC、WTL、wxWidgets 比较麻烦。
独立安装:Qt 程序最终会编译为本地代码,不需要其他库的支撑,而 Java 要安装虚拟机,C# 要安装 .NET Framework。
跨平台:如果你的程序需要运行在多个平台下,同时又希望降低开发成本,Qt 几乎是必备的。
Qt支持的平台:Windows、Linux、Mac OS X
QT下载安装教程:
Qt下载:5.9的版本是长期稳定支持的版本,上一个版本是5.6
官网:http://download.qt.io/
国内镜像源:
中国科学技术大学:http://mirrors.ustc.edu.cn/qtproject/
清华大学:https://mirrors.tuna.tsinghua.edu.cn/qt/
北京理工大学:http://mirror.bit.edu.cn/qtproject/
中国互联网络信息中心:https://mirrors.cnnic.cn/qt/
进入网站后:进入archive目录,再进入qt,选择对应的版本目录:
qt-opensource-linux-x64-5.9.9.run:linux运行环境
qt-opensource-mac-x64-5.9.9.dmg:macos运行环境
qt-opensource-windows-x86-5.9.9.exe:windows运行环境
安装组件勾选:
1.MinGw(C++编译器)
2.Qt开头的所有
3.Source
4.Tools把所有勾选
QT创建项目教程:
QtCreator使用:
1.新建项目
Qt Widgets Application:桌面平台应用程序,提供一套C++支持库
Qt Console Application:控制台应用程序,无GUI界面
Qt for Python:创建可部署的Qt Python应用程序,程序裤架采用Python语言
Qt Quick Application:创建可部署的Qt Quick2应用程序,界面采用QML语言,程序框架采用C++
2.选择Qt Widgets Application后
基类选择:
2.1、QMainWindow是主窗口类,有菜单栏、工具栏和状态栏
2.2、QWidget是所有具有可视界面类的基类,选择 QWidget 创建的界面对各种界面组件都可以支持
2.3、QDialog 是对话框类,可建立一个基于对话框的界面
3.项目管理:
.pro文件:项目管理文件,包括一些对项目的设置项
Headers文件夹:该目录下放头文件.h
Sources文件夹:该目录下放.cpp文件
Forms文件夹:该目录下放界面设计文件.ui,文件采用xml格式
Qt运行顺序:
1.进入main.cpp执行main函数
2.QApplication a (argc, argv); //实例化Qt应用程序
3.MainWindow w; //实例化窗体类,每个窗体对应一个类,放在mainwindow.cpp中,此操作会执行构造函数
4.w.show(); //调用窗体显示函数
5.return a.exec(); //a.exec()执行程序,该函数执行完毕程序结束会返回一个真假值,正常结束返回0,程序在此阻塞
调试程序:
#include ctrl+/ 取消注释
qDebug() << "打印数据";
信号与槽:
信号与槽:用于Qt处理界面中处理各个控件的交互操作
信号:在特定情况下发射,每个控件有不同信号可以发射,如pushButton的clicked信号,在鼠标点击时发射
槽:与信号对应的函数,当信号被接收到后执行的信号处理函数
处理机制:某个组件发生特定情况时,就发射信号,所以有一个发射者(sender),发射的信号种类有很多,需要指定一个信号(SIGNAL),信号被发射后,需要有人来进行接受该信号(receiver),接收者接收到信号后,做什么事情?所以需要指明一个槽函数(SLOT)
图形界面为组件绑定信号与槽函数:
1.选中组件,右击转到槽,会定位到一个函数,该函数便是槽函数,
在函数中编写信号接收到后要做的事情即可
动态控件生成:
1.实例化控件对象
QPushButton *btn = new QPushButton("显示文本",父类对象);
2.设置控件的属性
btn->setGeometry(QRect(300, 50, 211, 91));
3.为控件绑定信号、槽函数
connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect(ui->btn,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));
4.若控件是在信号处理函数中生成的需要
控件对象->show();
自定义信号:
在头文件signals栏中自定义一个信号:
void aaa(int a);
在头文件public slots栏中定义一个槽函数:
void bbb(int b);
在.cpp文件中为信号绑定槽函数:
connect(this,SIGNAL(aaa(int)),this,SLOT(bbb(int)));
在任意位置使用emit就可以发射信号,触发槽函数执行:
emit aaa(10);
解除信号绑定:
disconnect(this,0,0,0); //将指定对象的所有信号绑定解除
connect(发送者名,SIGNAL(信号名(信号携带参数),接受者(此为this),SLOT(aaa_handler(QString)));)//为m2对象的aaa函数绑定槽函数,
信号有发送者 (某对象),发送的信号是什么,接受者是谁(某对象),干什么事情(槽函数完成)
槽函数
该槽函数名为aaa_handler(QString recvData)
再在槽函数中将setText(填上传过来的参数recvData)
QString类:
Qt提供了自己的字符串处理类,不用担心内存分配以及关于\0结尾的这些注意事项,QSting会自动对占用的内存
进行扩充,链接非常的迅速
实例:
QString str = "hello";
str += "world"; //拼接字符串操作
对象函数:
str.append("hello"):在字符串末尾追加一个字符串,也是拼接动作
str.setNum(数值):将数值转为字符串存放
str.toLower():将字符串转为全小写并返回
str.toUpper():将字符串转为全大写并返回
str.mid(起始位置,截取个数):截取字符串,并返回,如果第二个参数省略,则默认截取到末尾为止
str.startsWith("字符串"):返回str是否是以指定字符串打头
str.endsWith("字符串"):返回str是否以指定字符串结尾
str.left(数值):返回str从左开始的n个字符串
str.right(数值):返回str从右开始的n个字符串
str.isEmpty():返回字符串是否是一个空串
str.replace(起始位置,个数,"替换的内容"):将str中指定位置的串替换掉
str.toUtf8():将QString转为QByteArray对象返回
注意:QByteArray对象与QString对象极为相似,只是QString是专门用来处理字符串的,能处理utf-8编码的所有字符
而QByteArray只是单纯用来处理数据的,除了能处理ASCII编码字符,其它复杂编码不能处理
QByteArray转QString:QString str = QByteArray("hello");
数据类型转换 : 以下方法是从QObject类上继承下来的
str.toInt()\toLong()\toUint()\toFloat()\toShort()\toDouble()\toLongLong()
str.toStdString():转为c++的标准string类对象.c_str()可以获取到char *类型的数据
格式化用法:
QString str = QString("%1 %2 %3").arg(1).arg(2.0).arg("hello")
QString str.sprintf("%d %s", 10, "hello");
str.split("分隔符"):将字符串以指定的分隔符分割为多个字串,返回一个QStringList
QStringList:是一个QString的集合类,可以保存多个字符串
实例:
QStringList strList;
strList[下标]:通过下标的方式访问集合中的字符串
strList << "串1" << "串2" << "串3" :将多个串追加到集合中
qstrList.append("字符串"):将指定字符串追加到集合中
strList.count():获取集合中字符串的总个数
strList.insert(位置,"字符串"):向集合指定位置中插入一个字符串
遍历:
for(QString item : strList)
{
qDebug() << item;
}
Qt常用窗口控件:
PushButton:按钮
font:字体调整
enable:是否可操作
geometry:设置初始位置和大小
cursor:当鼠标移动上去后要显示的形状
toolTip:鼠标移上去后的提示文本
styleSheet:为控件绑定的css样式(美化界面,修改颜色等) (css W3c官网教程)
icon:设置图标,可以将图标提前添加入资源文件中(百度搜->阿里图标库里)
建议建立资源文件:步骤:右键->addnew->QT->QTresourse 名称 以.qrc结尾
iconsize:图标的大小
text:显示的文本内容
信号:clicked,点击后触发
pressed,按钮按下后触发
released,按钮弹起时触发
优先级:pressed 》 released 》 clicked
LineEdit:单行文本框
text:文本框内容,后台通过setText()来设置
echoMode:Password,更改文本框为密码框
placeholderText:默认提示的内容
maxLength:限制输入的长度
ui->单行文本框控件对象->setPlaceholderText("默认显示的内容"):设置默认显示的内容
ui->单行文本框控件对象->setEchoMode(QLineEdit::Password):更改文本框为密码框
信号:
textChanged:当文本框内容改变时触发
textEdited:当通过setText函数改变时触发
cursorPositionChanged:当光标位置发生改变时
returnPressed:当Return或Enter键被按下时触发
RadioButton:单选按钮
text:显示的文本内容
checked:是否被选中(勾选会默认选中一个,当选择时可以在后台得知谁被选中)
ui->单选按钮控件对象->setChecked(bool):设置按钮是否被选中
ui->单选按钮控件对象->isChecked():获取按钮是否被选中
默认情况下RadioButton在同一个界面中被分为了一组,所以只会有一个按钮能够被选中,
可以通过GroupBox控件,将指定的按钮分为一组(就可以让他们父容器不同)
信号:同pushButton
CheckBox:复选框
text:显示的文本内容
checked:是否被选中
同RadioButton,只是一个是单选,一个是多选
信号:stateChanged:复选框选中状态改变时触发
其他同pushButton
CommandLinkButton:命令连接按钮
继承自pushButton,不同的是CommandLinkButton设计为扁平化的,可以显示两行文本内容,带有默认的icon
text:第一行标题内容
description:第二行描述文本内容
ListWidget:列表
右击编辑项目,可以添加每一项
currentRow:默认选中的项,-1表示不选中
常用后台属性方法:
添加项:
//追加项到指定行
1.ui->列表控件->addItem("显示的文本内容");
2.QListWidgetItem *item = new QListWidgetItem(QIcon("图标路径"),"显示文本");
ui->列表控件->addItem(item);
//插入项到指定行
3.ui->列表控件->insertItem(row,"显示的文本内容");
4.QListWidgetItem *item = new QListWidgetItem(QIcon("图标路径"),"显示文本");
ui->列表控件->insertItem(row,item);
删除项:
1.ui->列表控件->clear() :清除所有项
2.ui->列表控件->takeItem(row):删除指定行的项
其他:
3.ui->列表控件->count():获取项的总和
4.ui->列表控件->currentRow():返回当前选中行的行号
5.ui->列表控件->currentItem():返回当前选中项对象
信号:
1.currentItemChanged(QListWidgetItem current, QListWidgetItem previous)信号:
当列表部件中的当前项发生变化时发射,带两个参数,分别表示当前选择项和在此之前的选择项。
2.currentRowChanged(int currentRow)信号:当列表部件中的当前项发生变化时发射,带一个参数,currentRow表示当前项行号,
如果没有当前项,其值为-1。
3.currentTextChanged(str currentText):当列表部件中的当前项发生变化时发射,
带一个参数,currentText为当前项对应文本。
4.itemClicked(QListWidgetItem *item):当部件中的项被鼠标单击时发射该信号。
5.itemDoubleClicked(QListWidgetItem *item):当部件中的项被鼠标双击时发射该信号。
TreeWidget:树状表
右击编辑项目,可以设置列名称,项目栏中可以添加一级节点、二级节点......
添加项:
TreeWiget是整个控件,QTreeWigetItem是里面的每个节点项
ui->树状表控件.setHeaderHidden(true); //隐藏表头
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList()<<"第一列显示的文本"<<"第二列显示的文本");
ui->树状表控件->addTopLevelItem(item):控件添加顶级节点
ui->树状表控件->topLevelItem(索引):获取到指定索引的顶级Item,是一个QTreeWidgetItem对象
ui->树状表控件->takeTopLevelItem(索引):移除指定索引的顶级item
ui->树状表控件->currentItem():获取到当前选中的Item,若没有则为空,若有选中的返回一个QTreeWidgetItem对象
QTreeWidgetItem对象有一个addChild(QTreeWidgetItem *)的方法用于添加其子节点
child(索引):获取指定索引的子节点
setExpanded(bool):是否展开节点
takeChild(索引):移除指定索引的节点
text(索引):获取到指定item的指定列的文本数据
信号:
1.currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)信号:
当列表部件中的当前项发生变化时发射,带两个参数,分别表示当前选择项和在此之前的选择项。
2.itemExpanded(QTreeWidgetItem *current):
选项展开时执行触发
3.itemDoubleClicked(QTreeWidgetItem *current):
当选项被双击时触发
TableWidget:表格
ui->表格控件->setRowCount(行数):设置表格的总行数
ui->表格控件->setColumnCount(列数):设置表格的列数
ui->表格控件->setHorizontalHeaderLabels(QStringList):根据QStringList指定的数据设置列标题名称
ui->表格控件->setVerticalHeaderLabels(QStringList):根据QStringList指定的数据设置行标题名称
ui->表格控件->setItem(行,列,new QTableWidgetItem("数据")):设置表中单元格的数据
ui->表格控件->setEditTriggers(QAbstractItemView::NoEditTriggers):禁止修改表中的数据
ui->表格控件->setSelectionBehavior(QAbstractItemView::SelectRows):选中方式为整行选中
ui->表格控件->verticalHeader()->setVisible(false):隐藏列表头
ui->表格控件->horizontalHeader()->setVisible(false):隐藏行表头
ui->表格控件->setCellWidget(行,列,控件对象):将一个控件对象添加进单元格中
ui->表格控件->item(行,列):获取到指定行列的单元格对象
ui->表格控件->item(行,列)->text():获取到指定行列中的数据
ui->表格控件->removeRow(行数):删除掉指定的行
ui->表格控件->currentRow():获取到选中行的索引
ui->表格控件->item(行,列)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter):
设置指定单元格中文本显示的对齐方式
水平对齐:
Qt::AlignLeft:左对齐
Qt::AlignRight:右对齐
Qt::AlignHCenter:居中对齐
Qt::AlignJustify :在可用控件中对齐
垂直对齐:
Qt::AlignTop :上对齐
Qt::AlignBottom :下对齐
Qt::AlignVCenter :居中对齐
若两个都要用就:Qt::AlignHCenter|Qt::AlignVCenter即可
ui->表格控件->setSpan(要合并的行,要合并的列, 合并的行数,合并的列数):合并单元格
ui->表格控件->setColumnWidth(列,宽度):设置某列的宽度
ui->表格控件->setRowHeight(行,高度):设置某行的高度
ui->表格控件->resizeColumnsToContents():设置列大小由内容决定
ui->表格控件->resizeRowsToContents():设置行大小由内容决定
信号:
cellChanged(int row,int col):单元格改变时触发,会将触发的单元格索引传入
cellClicked(int row,int col):单元格被单击时触发,会将触发的单元格索引传入
cellDouble(int row,int col):单元格被双击时触发,会将触发的单元格索引传入
cellPressed(int row,int col):单元格被鼠标按下时触发,会将触发的单元格索引传入
tabWidget:选项卡
ui->选项卡控件->setTabPosition(QTabWidget::North):设置标题的方向
QTabWidget::North:北方
QTabWidget::West:西方
QTabWidget::South:南方
QTabWidget::East:东方
ui->选项卡控件->addTab(new QWidget(this),QIcon("icon路径"),"选项卡名称"):添加新的选项卡
第一个参数可以是新对象,也可以是一个新建的QWidget实例对象
ui->选项卡控件->clear():清除所有的选项卡
ui->选项卡控件->removeTab(索引):移除指定索引的选项卡
ui->选项卡控件->currentIndex():获取当前页面索引
ui->选项卡控件->setCurrentIndex(索引):切换到指定索引的选项卡
信号:
currentChanged(int):当前选项更改时触发
tabBarClicked(int):选项被点击时触发
tabBarDoubleClicked(int):选项被双击时触发
comboBox:下拉框
ui->下拉框控件->addItem("显示文本",绑定的数据):添加选项到下拉框中
ui->下拉框控件->currentText():获取下拉框当前选中项的文本
ui->下拉框控件->currentData():获取下拉框当前选中项的数据
ui->下拉框控件->clear():移除所有的选项
ui->下拉框控件->removItem(索引):删除制定选项
信号:
currentIndexChanged(int index):当前下拉选项发生改变时触发
currentIndexChanged(QString text):当前下拉选项发生改变时触发,将变化后的选项文本传入
textEdit:富文本框
ui->富文本框控件->append("文本内容"):追加内容到文本框中
ui->富文本框控件->setAlignment(Qt::AlignRight):设置上一行文本内容的对齐方式
Qt::AlignRight:右对齐
Qt::AlignLeft:左对齐
Qt::AlignCenter:居中对齐
ui->富文本框控件->setReadOnly(bool):是否只读
ui->富文本框控件->toPlainText():获取文本框中的内容