QT 基础知识一(QT安装、创建项目、常用窗口控件使用、信号与槽机制讲解)

QT概念

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():获取文本框中的内容

你可能感兴趣的:(QT,qt,开发语言)