当前位置:   article > 正文

1-初识QT

1-初识QT

1、第一个QT程序

新建一个独立的文件夹,在文件夹中新建一个main.cpp文件,键入一下内容

#include<QApplication> // QT的应用程序类
#include<QLabel> // 构造标签
int main(int argc,char * argv[ ]){
    //构建 QT应用程序
    QApplication app(argc,argv);
    //构建QLbel对象
    QLabel label("Hello,stm32\n");
    label.show();
    return app.exec();// 不返回,事件的监听器
    //等待事件发生( 用户、系统)-捕获事件
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在控制台中,当前文件下输入qmake -project 生成.pro文件 在生成的.pro文件中加入QT +=widgets语句
然后再控制台输入qmake 这个命令会生成makefile文件
最后输入mingw32-make 这个命令会完成编译和链接
最后在生成的文件夹中找到release文件夹,里面有一个可执行的exe文件,打开即可看见效果
在这里插入图片描述

2、父窗口

  • 创建控件时,可以指定停靠在某个父窗口上面,这时控件将作为子窗口被束缚在其父窗口的内部,并伴随父窗口一起移动、隐藏、显示和关闭;否则该控件将作为独立窗口显示在屏幕上,且游离于其它窗口之外
  • QWidget及其子类的对象可以做为其它控件的父窗口
  • 常用的父窗口类有如下三个:
    • QWidget
    • QMainWindow(主窗口) //QWidget的直接子类
      • QDialog(对话框) //QWidget的直接子类
  • 父窗口的析构函数会自动销毁其所有的子窗口对象,因此即使子窗口对象是通过new操作符动态创建的,也可以不显式的执行delete操作,而且不用担心内存世漏的问题,只要保证父窗口对象被正确销毁,其子窗口也将随之被销毁
  • 设置窗口的位置和大小
    • void move (int x,int y);
    • void resize (int w,int h);
#include<QApplication>//Qt应用类
#include<QLabel>//标签
#include<QPushButton>//按钮类
#include<QWidget>//基类父窗口类
#include<QMainWindow>//主窗口类
#include <QDialog>
//对话框类
int main(int argc,char*argv[]){
    QApplication app(argc,argv);
    //构建父窗口
    QWidget parent;
    parent.move(500,300);//设置父窗口位置
	parent.resize(300,300);//父窗口大小
    //构建子控件,停靠在父窗口上
    QLabel label("我是快乐的子窗口",&parent);
    label.move(80,30);//子窗口位置
    label.resize(140,30);//设置label大小
    QPushButton btnOK("保存",&parent);
    btnOK.move(40,90);
    btnOK.resize(100,30);
    QPushButton *btnCancel=new QPushButton("不保存",&parent);
    btnCancel->move(165,90);
    btnCancel->resize(100,30);
    //将父窗口显示出来
    parent.show();
    return app.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3、QT信号和槽

3.1 什么是信号和槽

  • 信号和槽是QT自行定义的一种通信机制,实现对象之间的数据交互。
  • 当用户或系统触发了一个动作,导致某个控件的状态发生了改变,该控件就会发射一个信号,即调用其类中一个特定的成员函数(信号),同时还可能携带有必要的参数
  • 槽和普通的成员函数几乎没有太多区别,可以是公有的、保护的或私有的,可以被重载,也可以被覆盖,其参数可以是任意类型,并可以像普通成员函数一样调用
  • 槽函数与普通成员函数的差别并不在于其语法特性,而在于其功能。槽函数更多体现为对某种特定信号的处理,可以将槽和其它对象信号建立连接,这样当发射信号时,槽函数将被触发和执行,进而来完成具体功能

3.2 信号和槽

  • 信号的定义
class XX:public QObjectt
	Q_OBJECT
signals:
	void signal func(...);/信号函数
}
  • 1
  • 2
  • 3
  • 4
  • 5

注意:信号函数只需声明,不能写定义

  • 槽的定义
class XX:public QObjectt
	Q_OBJECT
public slots:
	void slot_func(...){...};// 槽函数
}
  • 1
  • 2
  • 3
  • 4
  • 5

注意:槽函数可以连接到某个信号上,当信号被发射时,槽函数将被触发和执行,另外槽函数也可以当做普通的成员函数直接调用

  • 信号和槽的连接
QObject::connect(const QObject* sender,const char* signal,const QObject* receiver,const char* method);
  • 1
  • sender:信号发送对象指针
  • signal:要发送的信号函数,可以使用"SIGNAL()”宏进行类型转换
  • receiver:信号的接收对象指针
  • method:接收信号后要执行的槽函数,可以使用"SLOT()”宏进行类型转换
    -案例:
    实现点击按钮关闭标签
  • 按钮点击时发送信号:clicked()
  • 实现标签关闭功能的槽函数:close()
#include<QApplication>//Qt应用类
#include<QLabel>//标签
#include<QPushButton>//按钮类
#include<QWidget>//基类父窗口类
#include<QMainWindow>//主窗口类
#include <QDialog>
//对话框类
int main(int argc,char*argv[]){
    QApplication app(argc,argv);
    //构建父窗口
    QWidget parent;
    parent.move(500,300);//设置父窗口位置
    parent.resize(300,300);//父窗口大小
    //构建子控件,停靠在父窗口上
    QLabel label("我是快乐的子窗口",&parent);
    label.move(80,30);//子窗口位置
    label.resize(140,30);//设置label大小
    QPushButton btnOK("保存",&parent);
    btnOK.move(40,90);
    btnOK.resize(100,30);
    QPushButton *btnCancel=new QPushButton("不保存",&parent);
    btnCancel->move(165,90);
    btnCancel->resize(100,30);
    //将父窗口显示出来
    parent.show();
    // 建立信号和槽的链接关系
    // btnOK ---- clicked----lebel ----close
    // 实现点击按钮关闭标签
    QObject::connect(&btnOK,SIGNAL(clicked()),&label,SLOT(close()));
    // 点击btnCancel按钮,关闭父窗口
    QObject::connect(btnCancel,SIGNAL(clicked()),&parent,SLOT(close()));
    return app.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

4、使用QT实现加法器

4.1 初始化工程

新建一个项目,名称为Calculator,使用的类名为CalculatorDialog,基类为QDialog,这里主要使用的控件有QPushButton,QLabel,QLineEdit。
在这里插入图片描述

在设计UI界面中,设置控件的属性

QLineEdit:
	Objectname - m_editX	
	alignment - 水平方向 - AlignRight
QLineEdit:
	Objectname - m_editY
	alignment - 水平方向 - AlignRight
QLineEdit:
	Objectname - m_editZ
	alignment - 水平方向 - AlignRight
	readOnly - √
QPushButton:
	Objectname - m_button
	text - = 
	enabled - √划掉
QLabel:
	text - +
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

4.2 设置槽函数

为了建立关系,这里需要在等号位置设置槽函数
在这里插入图片描述

在跳转的函数中书写相关的业务,以实现两个数相加,并将结果放入到后面的控件中。

// = 按钮对应的槽函数
// text() -- 获取控件文本
// setText(QString) -将文本放到某个控件上
void CalcultorDialog::on_m_button_clicked()
{
    ui->m_editZ->setText(QString::number(ui->m_editX->text().toDouble() +
	    ui->m_editY->text().toDouble()));
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

书写好槽函数之后,我们思考一下,
1:如果两个加数没有被赋值,那么该函数是不是不应该被调用,那么我们就需要在等号的位置设置使能操作,以确保每次按下等号按钮后,两个操作数是有值的。
2:用户在输入内容时,是否存在输入了不合法的字符,我们是不是应该剔除掉
针对上面2种可能得情况,我们需要引入一个类数字验证器的类QDoubleValidator,来验证用户输入的内容,以保证操作数都是数字,新建一个等号使能按钮的槽函数,建立信号和槽函数的联系,用来保证计算时,操作数不为空。

// 设置操作数为数字,并建立信号和槽之间的连接
#include <QDoubleValidator>
CalcultorDialog::CalcultorDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::CalcultorDialog)
{
    ui->setupUi(this);
    // 设置数字验证器 需要引入QDoubleValidator文件
    ui->m_editX->setValidator(new QDoubleValidator(this));
    ui->m_editY->setValidator(new QDoubleValidator(this));
    // 建立信号和槽的连接
    // m_editX--信号到使能槽函数
    connect(ui->m_editX,SIGNAL(textChanged(QString)),this,SLOT(enableButton()));
    // m_editY--信号到使能槽函数
    connect(ui->m_editY,SIGNAL(textChanged(QString)),this,SLOT(enableButton()));
}

// 使能等号的槽函数
void CalcultorDialog::enableButton(){
    bool xOK,yOK;
    // text() - 获取控件文本
    ui->m_editX->text().toDouble(&xOK);
    ui->m_editY->text().toDouble(&yOK);
    // setEnable(bool) -- 让某个控件使能
    ui->m_button->setEnabled(xOK && yOK);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/634526
推荐阅读
相关标签
  

闽ICP备14008679号