回顾:
1.构建一个QT工程步骤
(1)qmake -project
(2)qmake
(3)make
2.两个常用的组件
QLabel 标签
QPushButton 按钮
--------------------------------------
四 容器窗口(父窗口)
1.父窗口可以停靠其他组件,如果一个组件在创建时指定父窗口,那么就将停靠在父窗口上,如果不指定则飘在外面形成独立的窗体.
2.常用的父窗口类
QWidget ==>绝大多数图形相关组件都是它的子类
QMainWindow(用的比较多,是QWidget的子类)
QDialog(用的比较多,是QWidget的子类)
3.QWidget的两个常用成员函数
(1)调整大小
resize(int x,int y); //参数是分辨率
(2)移动位置
move(int x,int y);
五 信号和槽的其他用法
1.一般情况信号和槽参数纯虚类型要相同
eg:
QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(int,string))); //ok
QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(string,int))); //no
2.可以带有缺省参数
eg:
QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int,string=“"))); //ok
3.信号函数参数可以多于槽函数参数,多余的参数将被忽略
eg:
QObject::connect(A,SIGNAL(sigFunc(int,string)),B,SLOT(slotFunc(int))); //ok
QObject::connect(A,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int,string))); //no
4.一个信号可以被连接到多个槽函数
eg:
QObject::connect(A,SIGNAL(sigFunc(int)),B1,SLOT(slotFunc(int))); //ok
QObject::connect(A,SIGNAL(sigFunc(int)),B2,SLOT(slotFunc(int))); //ok
注: 当A发送信号sigFunc,B1/B2的槽函数都会被执行,执行的顺序不确定
5.多个信号可以连接到同一个槽函数
QObject::connect(A1,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int))); //ok
QObject::connect(A2,SIGNAL(sigFunc(int)),B,SLOT(slotFunc(int))); //ok
注: 无论A1还是A2发出信号,B的槽函数都会被执行
案例《事件同步》
1.QSilder 滑块类
QSlider(QWidget *parent = Q_NULLPTR)
QSlider(Qt::Orientation orientation, QWidget *parent = Q_NULLPTR)
Qt::Vertical 垂直的
Qt::Horizontal 水平
void setRange(int min,int max)[slots]; //设置滑动范围
void setValue(int)[slots]; //设置当前值
void valueChange(int value)[signal]; //值改变信号
void setPageStep(int);//设置页步距
2.QSpinBox 选值框类(微调框)
QSpinBox(QWidget *parent = Q_NULLPTR);
void setRange(int minimum, int maximum);//设置选值范围
void setValue(int val)[slots];//设置当前值
void valueChanged(int i)[signal];//值改变信号
六 面向对象的QT编程
1.基于对象的QT编程(不建议)
2.面向对象的QT编程
《案例》加法计算器
class CalculateDialog:public QDialog{
行为:
构造函数:初始化界面 禁用等号按钮
public slots:
当输入左右操作数,发送信号,检查是否为有效数字,如果都是有效的,是能等号按钮
当点击等号按钮,发送信号 计算结果并显示
属性:
QLineEdit QLabel QPushButton
}
案例代码如下:
#ifndef __CALCULATORDIALOG_H #define __CALCULATORDIALOG_H #include <QDialog> #include <QLabel> #include <QPushButton> #include <QLineEdit> //输入文本的组件 #include <QDoubleValidator> //双精度的校验器 #include <QHBoxLayout> //水平布局器 class CalculatorDialog:public QDialog{ //MOC编译器,把不符合标准的语法变成标准的C++语法 Q_OBJECT public: CalculatorDialog(void); private: QLineEdit *m_editX; //左操作数 QLineEdit *m_editY; //右操作数 QPushButton *m_btnCalc; //等号按钮 QLineEdit *m_editZ; //保存结果,只读属性 private slots: void enableCalcButton(void); //使能等号按钮 void calcClicked(void); //计算结果 }; #endif // __CALCULATORDIALOG_H
CalculatorDialog.h
#include "CalculatorDialog.h" //构造函数中初始化UI界面 CalculatorDialog::CalculatorDialog(void){ //设置对话框的标题 (继承过来的成员函数) setWindowTitle("加法计算器"); m_editX = new QLineEdit(this); //设置文本右对齐 m_editX->setAlignment(Qt::AlignRight); //设置验证器,只能输入数字 m_editX->setValidator(new QDoubleValidator(this)); m_editY = new QLineEdit(this); //设置文本右对齐 m_editY->setAlignment(Qt::AlignRight); //设置验证器,只能输入数字 m_editY->setValidator(new QDoubleValidator(this)); m_editZ = new QLineEdit(this); m_editZ->setAlignment(Qt::AlignRight); //设置右对齐 m_editZ->setReadOnly(true); //设置只读 m_btnCalc = new QPushButton("=",this); m_btnCalc->setEnabled(false);//设置禁用 //使用水平布局器,自动调整每个组件的大小和位置 QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(m_editX); layout->addWidget(new QLabel("+")); layout->addWidget(m_editY); layout->addWidget(m_btnCalc); layout->addWidget(m_editZ); //设置布局器 setLayout(layout); //编辑框内容改变时发出信号,尝试使能等号按钮 connect(m_editX,SIGNAL(textChanged(const QString &)),this,SLOT(enableCalcButton())); connect(m_editY,SIGNAL(textChanged(const QString &)),this,SLOT(enableCalcButton())); //点击等号按钮,计算结果并显示 connect(m_btnCalc,SIGNAL(clicked()),this,SLOT(calcClicked())); } void CalculatorDialog::enableCalcButton(void){ bool bXOk; bool bYOk; //获取左右操作数的数据(QString),转换成浮点数 m_editX->text().toDouble(&bXOk); m_editY->text().toDouble(&bYOk); //如果左右操作数都是有效的数字,使能等号按钮 if(bXOk && bYOk){ m_btnCalc->setEnabled(true); } else{ m_btnCalc->setEnabled(false); } } void CalculatorDialog::calcClicked(void){ //计算结果 double res = m_editX->text().toDouble() + m_editY->text().toDouble(); //将结果转换成字符串 QString str = QString::number(res,); //显示结果到m_editZ m_editZ->setText(str); }
CalculatorDialog.cpp
#include "CalculatorDialog.h" #include <QApplication> int main(int argc, char **argv){ QApplication app(argc,argv); CalculatorDialog dialog; dialog.show(); return app.exec(); }
Calculator.cpp