QT是利用C++进行编写,而QT则是C++的实际运用的一种方式。
QT也称GUI------grphical user interface(图形用户接口)
通过图形的方式操纵计算机用户界面
QT的特点以及应用:
1、跨平台(可以在多个平台上进操作(windows、linux))
2、面向对象(QT里封装的机制非常完善。编程方式和C++一样)
3、丰富的API(数据库(sqlite、mysql等等)、网络编程(network:UDP、TCP)、3D绘图、3D渲染、文件I/O等等
1、信号与槽机制(重点)
实现两个对象之间的通信的机制,让两个对象可以进行通信
函数:connect 作用:绑定两个对象,使两对象可以正常进行通信,反之,则不能通信
connect函数的形式:
connect(对象1 ,对象1发出的信号 , 对象2 ,对对象1发出的信号进行处理);
对象1:是类1的实例化---对象1
对象2:是类2的实例化---对象2
对象1发出的信号:函数,该函数可以携带信息--------信号函数
对对象1发出的信号进行处理 :函数,可以对信号携带信息进行处理 -----槽函数
简单的理解就是对象1触发信号后对象2就运行槽函数(收到信号干事)
什么是信号(信号函数)?
信号可以称为触发,如去朋友家,你需要告诉它到了,它才来开门,这个告诉它就是信号。而我们的信号函数则都只能进行声明,是不允许实现或者定义的。如果你在那个类里要一个信号函数,那么就在那个类的.h文件中在关键字 signals:下进行声明。
而且信号函数允许带参数,但信号函数的参数必须大于槽函数参数,返回类型是void类型。
什么是槽函数?
槽函数既在收到信号函数发送的信号后,开始执行需要的程序。也可以这样理解,就是你把要做的事情准备好,接到这个信号过后才开始执行。而我们的槽函数则声明在关键字slots下,当然槽函数遵从继承的三种情况。槽函数与信号函数的区别在于既要声明函数也要实现函数。而且槽函数也可以带参数,但比信号函数参数少,槽函数的返回值类型也是void类型。
这就是一个源代码进行敲写的,从上面的最后一张图可以看出,connect在第一次使用时,它的前后都是信号,其实这种情况就是第一个信号触发第二个信号,第二个信号也就触发了,它在触发槽函数。
而进行编写QT程序则拥有两种方式; 源代码敲写(全部敲写)和图像化编程(部分功能敲写)
下面来讲解哈,QT可以创建那些界面;
1、QDialog类
提供了一个简单的对话框,一般作为顶级窗口(窗口的最外层),其他窗口部件可以嵌入到该对话框里,该对话框不会嵌入到其他窗口里。对话框拥有两种状态:模态对话框和非模态对话框
模态对话框:使用模态对话框则会发生程序阻塞,只有关闭该对话框的时候,程序才会继续执行,模态对话框通过调用exec()函数来实现。
非模态对话框:以非模态的形式出现,后面的程序就不会阻塞在这里,非模态对话框一般是通过调用show()函数来实现
2、QMainWindow类
该类提供了菜单栏、工具栏、状态栏、工作区(浮动、漂浮、悬空等)等功能,一般也是不会嵌入到其他窗口里,通常作为顶级窗口。
3、QWidget类
QWidget类是所有窗口部件的基类,QDialog和QMainWindow等等都是QWidget的子类,可以嵌入到其他窗口里,也可以作为顶级窗口。
以下是一些在界面时用到的函数
(1)show();将界面显示出来,设置界面以非模态形式显示
(2)hide();将界面隐藏
(3)close();将界面关闭,释放了空间
(4)setWindowTitle(QString)设置界面的标题
(5)setFixedSize(int w , int h);设置窗口为固定大小
(6)resize(int w , int h);设置窗口的初始大小,后期可以更改窗口的大小
(7)setWindowIcon(const QIcon(QString &fileName);//设置窗口的图标
(8)exec();设置界面以模态的形式显示
2、基本的窗口部件
在记录这些基础的窗口部件时,在制作这些时分为两种方式进行编程,但无论是哪种方式,其实都是一样的,一个时底层开发一个是应用层开发的感觉,因为源码就是我们图形编程所选择的那些。还有就是这些基础的窗口部件都是继承QWidget类的,所有这个属性框里的内容差不多。而我们实际需要修改的是格窗口部件属性,根据自己的需求进行修改。
如果在学习的阶段,自己弄不懂什么可以采用QT软件所带来的帮助进行,需要用到哪一个,就点击帮助,在帮助里面找到选择索引模式,就可以进行搜索了,那个不懂就直接搜他如QPushButton,就直接可以了,里面包含了这个窗口部件的所有信息。
2.1、普通按钮(QPushButton)
这种就是最普通的按钮,只要按下就会变化,它的状态也就只有按下和没按下两种状态。一般当按下的时候会产生信号。
如果使用图形化界面进行编写,则只需要修改右下角的黄生上下的QObject、QWidget、QDialog三个就可以实现了。
里面大部分时英文,大致翻译操作如下:
****************属性******************
objectName:修改类的对象名
enabled:是否启用该按钮,如果是true,否则就是false
geometry:设置该类的几何属性
sizePolicy:设置该类的尺寸
minimumSize:设置该类的最小尺寸
maxmumSize:设置该类的最大尺寸
font:设置该类里的内容的文本的字体
cursor:设置鼠标定位到该控件的时候,鼠标显示的样式
toolTip:设置鼠标定位到该控件的时候,提示的文本信息
toolTipDuration:设置提示的文本的显示的时间
statusTip:设置文本提示的状态
styleSheet:设置该控件里的图片的样式为自适应
text:设置该控件里的文本的内容
icon:向该控件里设置图片
iconsize:设置图片的大小
shortcut:设置该控件的快捷键
checkable:设置该控件是否按下使能
checked:设置按钮初始化是否是按下
flat:是否隐藏该控件的背景,如果是true则隐藏,否则是false不隐藏
配置好这些之后,如何进行操作呢?只需要点中对话框,然后右击出现很多选项,此时选择转换为槽,既槽函数,然后会有以下的界面
在这个界面里需要我们选择那种触发方式,其详细的解释如下:
clicked():点击信号
pressed():鼠标按下
released():鼠标按下并释放
toggled():按钮按下再释放,释放再按下
选择好方式后,点OK后会直接转到源程序当中,只需要进行编写需要处理的事情就可以了,大大节省开发时间。其实源码也是配置这些需要收到手动去更改的这些
当然也可以选择进行源码的开发:
QPushButton(QWidget *parent = nullptr):可以带参可以不带参,不带参--不嵌入到其他窗口里,带参--可以嵌入到其他窗口里
QPushButton(const QString &text, QWidget *parent = nullptr):实例化时指定按钮里显示的文本
QPushButton(const QIcon &icon, const QString &text, QWidget *parent = nullptr):实例化时指定显示的图片和文本
setParent(QWidget *widget):设置该控件显示到哪个窗口里
btn.setParent(this);//将按钮显示到当前界面里
btn.setText("btn");//设置按钮里显示的文本
btn.resize(50,50);//设置按钮的宽度和高度
btn.setFixedSize(50,50);//设置按钮的固定的大小(宽度和高度)
btn.setFixedWidth(50);//设置按钮固定的宽度
btn.setFixedHeight(50);//设置按钮固定的高度
btn.move(100,0);//设置按钮显示的位置
btn.setFlat(false);//设置按钮的背景是否隐藏,true--隐藏 , false---不隐藏
btn.setFont(QFont("宋体",16));//设置按钮里的文本的字体格式
btn.setIcon(QIcon(":/image/re.jpg"));//设置按钮显示的图片
btn.setIconSize(QSize(16,16));//设置图片的大小
btn.adjustSize();//设置按钮里的内容自适应按钮的大小
btn.setStyleSheet("border-image: url(:/image/re.jpg)");//设置按钮的图片的样式
btn.setCursor(Qt::PointingHandCursor);//设置鼠标定位到按钮上显示的光标样式
btn.setToolTip("这是btn");//设置鼠标定位到按钮上提示的文本
btn.setGeometry(0,0,50,50);//设置按钮的几何位置,1,2参数表示坐标,3,4参数表示宽度和高度
btn.setCheckable(true);//设置按钮是否按下使能
btn.setChecked(true);//设置按钮的初始状态是按下
btn.setShortcut(QKeySequence::Backspace);//设置按钮的快捷键
btn.setEnabled(true);//设置按钮是否启用,true--启用,false--禁用
两种方法运行的效果都是一样的,只不过源码的方式比较需要很多配置。如果还知道更多的知识就去帮助里面查找信息。
2.2、单选按钮(QRadioButton)
什么叫做单选按钮呢,就是可以有两种的选择,就是选择与不选择,就像填写我们的问卷调查,需要点那个一样,它的格式则如下所示:
当然也是分图形编程和源码编程的,这个一样可以进行选择开发。不过它的属性设置和上面叛徒按钮一模一样所以就不解释了。
2.3、标签(QLabel)
主要的作用就是用来做标记的,就像一个东西需要名字一样。这个的作用就是用于做标记的
应为许多的都是继承与QDialog,只需要修改它本身的内容就行也就是QLabel下的属性。
一般没有其他功能,就只是做一个显示给别人看的。
它的属性有:
frameShape:设置标签的边框样式
frameShadow:设置标签边框的阴影
lineWidth:设置线宽
midLineWidth:设置中间线宽
text:设置标签里的文本
textFormat:设置文本格式---plainText:纯文本格式----RichText:富文本格式----AutoText:结合了plainText和RichText的特点
pixmap:设置标签显示的图片
scaledContents:设置图片自适应标签的大小
alignment:设置标签里的文本的对齐方式
wordWrap:设置标签里的文本自动换行
margin:设置标签里的文本据标签的距离(边距)
indent:设置标签里的文本的缩进
2.4、复选框(QCheckBox)
复选框也就是前面有一个正方形的框,具有三种状态或者两者状态的选择
而复选框最大的优点就是他可以触发两者状态或者三种状态,选两者还是三种都是选中我们拖出来的这个复选框。在右下角的QCheckBox属性中,将tristate打勾就是两者状态,默认就是三种状态。
三种状态:全选中状态、半选中状态、未选中状态
两种状态:全选中状态、未选择状态
如果是需要源码的开发,则需要进行以下的操作:
信号:void stateChanged(int state)//只要复选框的状态改变就会触发该信号
checkBox.setParent(this);//设置复选框显示在哪个窗口里
checkBox.setText("复选框");//设置复选框显示的文本
checkBox.resize(80,30);//设置复选框的大小
checkBox.setTristate(true);//设置复选框的状态,true----三种状态 , false----两种状态
checkBox.setCheckState(Qt::Checked);//设置复选框的初始状态
checkBox.setIcon(QIcon("图片的资源路径"));//设置复选框里显示的图片
checkBox.setIconSize(QSize(10,10));//设置图片的大小
Qt::CheckState state=checkBox.checkState();//获取复选框的状态
if(state==Qt::Unchecked)//value=0
{
qDebug()<<"复选框是未选中状态"<<endl;
}
else if(state==Qt::PartiallyChecked)
{
qDebug()<<"复选框是半选中状态"<<endl;
}
else if(state==Qt::Checked)
{
qDebug()<<"复选框是全选中状态"<<endl;
}
connect(&checkBox,SIGNAL(stateChanged(int)),this,SLOT(display(int)));
2.5、行编辑框(QLineEdit)
行编辑框主要是用于输入信息用的,相当于是一个输入框,既上面显示你输入的信息,而且可以选择内容可见以及内容不可见。
剩余的开发与上面几种一样,所有省略
源码开发:
lineEdit.setParent(this);//设置行编辑框显示在当前界面
lineEdit.resize(100,40);//设置行编辑框的大小
lineEdit.setPlaceholderText("请输入账号");//设置行编辑框提示的内容
lineEdit.setFrame(true);//设置行编辑框的边框,true---有边框 , false---无边框
lineEdit.selectAll();//选择行编辑框里的所有内容
lineEdit.setText("123456");//设置行编辑框里显示的文本
lineEdit.setReadOnly(true);//设置行编辑框是否是可读的,true--表示可读, false--不可读
lineEdit.setEchoMode(QLineEdit::Normal);//设置行编辑框里的文本的可见形式
lineEdit.setMaxLength(10);//设置行编辑框里输入的文本的字符最大长度
lineEdit.setAlignment(Qt::AlignLeft);//设置行编辑框里的文本的对齐方式
lineEdit.text();//获取行编辑框里的文本的内容
QLineEdit::EchoMode mode=lineEdit.echoMode();//获取行编辑框里的文本显示的形式
if(mode==QLineEdit::Normal)
{
}
else if(mode==QLineEdit::NoEcho)
{
}
else if(mode==QLineEdit::Password)
{
}
else if(mode==QLineEdit::PasswordEchoOnEdit)
{
}
lineEdit.clear();//清空行编辑框里的内容
connect(&lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(display(const QString &)));
2.6、单精度自旋框(QSpinBox)
单精度自旋框就是可以显示可调的整型的数字,可以为数字前面加上前缀以及数字后面加上后缀。但是当调节的时候就是数字在动。
其余的也就是差不多,下面的是源码开发的:
spinBox.setParent(this);//设置自旋框显示在当前的界面内
spinBox.resize(100,30);//设置自旋框的大小
spinBox.setRange(1,100);//设置自旋框调节的范围
spinBox.setValue(50);//设置自旋框的初始化值
spinBox.setPrefix("房屋:");//设置自旋框的里的数值的前缀
spinBox.setSuffix("万元");//设置自旋框里的数值的后缀
spinBox.setMaximum(100);//设置自旋框里的数值的最大值
spinBox.setMinimum(1);//设置自旋框里的数值的最小值
spinBox.setSingleStep(5);//设置自旋框里的数值的单步值
spinBox.setDisplayIntegerBase(10);//设置自旋框里的数值的基数
spinBox.setStepType(QAbstractSpinBox::DefaultStepType);//设置步进值的类型
spinBox.setFont(QFont("宋体",12));//设置自旋框里的数值的字体类型
int a=spinBox.value();//获取自旋框里的数值
QString pre=spinBox.prefix();//获取自旋框里的内容前缀
QString suf=spinBox.suffix();//获取自旋框里的内容的后缀
int max=spinBox.maximum();//获取自旋框里的数值的最大值
int min=spinBox.minimum();//获取自旋框里的数值的最小值
connect(&spinBox,SIGNAL(valueChanged(int)),this,SLOT(display(int)));
connect(&spinBox,SIGNAL(valueChanged(const QString &)),this,SLOT(display2(const QString&)));
2.7、双精度自旋框(QDoubleSpinBox)
双精度也就是可以设置显示整数后多少位,其他都和单精度是一样的。
2.8、组合框(QComboBox)
组合框就是有一个三角符号那种,点一下就可以进行选项,或者查看。
源码开发:(不懂就帮助索引进行详细的查找)
comboBox.setParent(this);//设置组合框显示在当前界面内
comboBox.setFixedSize(100,30);//设置组合框的固定的大小
comboBox.setFrame(true);//设置组合框的边框
comboBox.addItem("星期一");//向组合框里添加列表项
comboBox.addItem("星期二");//向组合框里添加列表项
comboBox.setEditable(true);//设置组合框是否是可编辑的,true--可编辑 , false--不可编辑
comboBox.setItemText(0,"星期三");//向组合框指定的位置插入列表项
QStringList list;
list<<"星期三"<<"星期四"<<"星期五";
comboBox.addItems(list);//向组合框里添加列表项列表
comboBox.clear();//情况组合框里的内容
int a=comboBox.currentIndex();//获取组合框里当前列表项的索引值
qDebug()<<"value:"<<a<<endl;
QString text=comboBox.currentText();//获取组合框当前列表项
qDebug()<<text<<endl;
int sum=comboBox.count();//获取组合框里的列表项的数量
qDebug()<<"总数:"<<sum<<endl;
QString text1=comboBox.itemText(0);//获取组合框里指定的下标对应的列表项
qDebug()<<text1<<endl;
connect(&comboBox,SIGNAL(currentTextChanged(const QString &)),this,SLOT(display(const QString &)));
connect(&comboBox,SIGNAL(currentIndexChanged(int )),this,SLOT(display1(int)));
2.9、分组框(QGroupBox)
源码开发:
groupBox.setParent(this);//设置分组框显示在当前界面
groupBox.resize(100,100);//设置分组框的大小
groupBox.setFlat(true);//设置边框是否隐藏,true--隐藏,false--不隐藏
groupBox.setTitle("分组框");//设置分组框的标题
groupBox.setAlignment(Qt::AlignLeft);//设置分组框标题的对齐方式
groupBox.setCheckable(true);//设置分组框前是否有复选框,true--有, false--没有
groupBox.setChecked(true);//设置分组框是否是选中状态,true--选中,false--未选中
if(groupBox.isFlat())
{
//判断分组框的边框是否是隐藏
}
if(groupBox.isChecked())
{
//判断分组框是否是被选中
}
groupBox.title();//获取分组框的标题
connect(&groupBox,SIGNAL(clicked()),this,SLOT(display()));
2.10、滑动条(QSlider)
滑动条 其实就是一个音量调节键,通过调节他,他会返回一个当前的值,这个值是在你定的范围内,也可以设置每次滑动的大小。
源码开发:
slider.setParent(this);//指定滑动条显示在当前的界面
slider.resize(100,30);//设置滑动条的大小
slider.setMaximum(100);//设置滑动条的最大值
slider.setMinimum(1);//设置滑动条的最小值
slider.setRange(1,100);//设置滑动条的范围
slider.setValue(50);//设置滑动条的当前值
slider.setTickPosition(QSlider::TicksAbove);//设置滑动条的刻度的位置
slider.setTickInterval(10);//设置滑动条的刻度
slider.setSingleStep(1);//设置滑动条的步进值(单步值)
slider.setOrientation(Qt::Horizontal);//设置滑动条摆放的位置
int a=slider.tickInterval();//获取滑动条的刻度值
QSlider::TickPosition position=slider.tickPosition();//获取滑动条的位置
connect(&slider,SIGNAL(sliderMoved(int )),this,SLOT(display(int)));
2.11、进度条(QProgressBar)
进度条就是向一个加载界面,加载了多少。
源码开发:
progressBar.setParent(this);//设置进度条显示在当前界面内
progressBar.resize(120,30);//设置进度条的大小
progressBar.setMaximum(100);//设置进度条加载最大值
progressBar.setMinimum(1);//设置进度条加载的最小值
progressBar.setRange(1,100);//设置进度条加载的范围
progressBar.setValue(50);//设置进度条当前值
progressBar.setFormat("%p%");//设置进度条的值的格式
progressBar.setAlignment(Qt::AlignLeft);//设置进度条的文本对齐方式
progressBar.setOrientation(Qt::Horizontal);//设置进度条摆放的位置
progressBar.setTextVisible(true);//设置进度条的值是否可见,true--可见,false--不可见
int a=progressBar.value();//获取进度条的值
progressBar.text();//获取进度条的文本
connect(&progressBar,SIGNAL(valueChanged(int )),this,SLOT(display(int)));//当进度条的值改变的时候会触发valueChanged(int )信号
2.12、滚动条(QScrollBar)
滚动条只是与滑动条不一样而已,但是功能却是差不多的。
源码开发:
scrollBar.setParent(this);//设置滚动条显示在当前界面
scrollBar.setFixedSize(20,100);//设置滚动条的大小
scrollBar.setRange(0,100);//设置滚动条的范围
scrollBar.setMaximum(100);//设置滚动条的最大值
scrollBar.setMinimum(0);//设置滚动条的最小值
scrollBar.setValue(50);//设置滚动条的当前值,初始位置
scrollBar.setSingleStep(1);//设置滚动条的步进值
scrollBar.setOrientation(Qt::Vertical);//设置滚动条的摆放的位置
connect(&scrollBar,SIGNAL(valueChanged(int )),this,SLOT(display(int )));
2.13、列表部件框(QListWidget)
列表部件框可以在里面增加内容,这些内容就像我们在wps的word文档里写东西一样。
源码开发:
listWidget.setParent(this);//设置列表部件框显示在当前界面
listWidget.resize(150,150);//设置列表部件框的大小
listWidget.clear();//清空列表部件框里的内容
listWidget.addItem("星期一");//向部件框里增加列表项
QStringList list;
list<<"星期二"<<"星期三"<<"星期四";
listWidget.addItems(list);
listWidget.takeItem(0);//获取部件框里的列表项
listWidget.count();//获取部件框里的列表项的数目
listWidget.insertItem(1,"星期天");//向部件框里的指定的位置插入列表项
QListWidgetItem *item=new QListWidgetItem;
listWidget.setCurrentItem(item);
这些窗口部件,无论是图形设置还是源码编写,都是其属性一样,不懂就去帮助里面查找其信息。