01_QT介绍

QT =》 GUI 编程 =》 图形界面
QT 是一套应用程序开发类库,跨平台
如何学习Qt ? =》 多看Qt 帮助文档(F:\Qt_system\5.12.3\mingw73_32\bin\assistant.exe)

1991年 由奇趣科技开发
1996年 进入商业领域 Linux(gnome、桌面环境KDE基础)
2008年 奇趣公司被诺基亚公司收购
2012年 Qt 又被微软公司收购

创建一个工程步骤:打开Qt Creator / 文件(File) =》 新建文件或项目(Ctrl + N) =》Application =》 Qt Widgets Application =》Choose… =》命名项目 并选择好路径 =》然后点击下一步 =》创建界面暂时先不勾选,后续讲解ui设计器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
QMainWindow 是主窗口类, 主窗口具有主菜单栏、工具栏和状态栏,类似于一般的应用程序的主窗口;
QWidget 是所有具有可视界面类的基类,选择QWidget 创建的界面对各种界面组件都可以支持;
QDialog 是对话框类,可建立一个基于对话框的界面。

#include "mywidget.h"
#include <QApplication>//应用程序类,qt 头文件没有.h , 头文件和类名一致

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);//有且只有一个应用程序类的对象
    MyWidget w;//创建窗口
    w.show();//窗口默认隐藏,需要人为显示

    return a.exec();//让程序一直执行,等待用户操作(阻塞)
}

samp_1.pro 项目管理文件
.h 头文件
.cpp 源文件
.ui 界面文件

=Qtcreator中常用快捷键总结===============

F1 查看帮助
F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)
Shift+F2 声明和定义之间切换
F4 头文件和源文件之间切换
——————————————————————————-
Alt+0 显示或者隐藏侧边条,编辑模式下起作用(有时写的函数太长,屏幕不够大,就用这个)
Ctrl+Space 自动补全(貌似会和输入法的切换冲突)
——————————————————————————-
esc 切换到编辑模式
Alt(按住)+ Enter 将光标移动到h文件中的方法声明。按Alt(按住),再按回车键将在cpp中添加该函数的定义。
——————————————————————————-
Ctrl+I 自动对齐
Ctrl+/ 注释行,取消注释行
——————————————————————————-
Ctrl+B 编译工程
Ctrl+R 运行工程
F5 开始调试
Shift+F5 停止调试
F9 设置和取消断点
F10 单步前进
F11 单步进入函数
Shift + F11 单步跳出函数
——————————————————————————

02_项目文件

QT += core gui 表示模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 高于4版本, 为了兼容QT4

TARGET = Project 项目名称
TEMPLATE = app 指定makefile 的类型,app 可执行程序 lib库

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 # 表示注释

CONFIG += c++11 Lamda 表达式需要

SOURCES += \ 源文件
main.cpp
mywidget.cpp

HEADERS += \ 头文件
mywidget.h

03_指定父对象

如果不指定父对象,对象和对象没有关系,独立,指定父对象,只需要显示父对象显示,上面的子对象自动显示
指定父对象有两种方式:
1)setParent
2)通过构造函数传参

#include "mywidget.h"


MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
	//设置标题
	this->setWindowTitle("标题");
		
	/*
	类成员函数有个特殊指针,this
	谁(哪个对象)调用这个成员函数,this 就指向这个对象
	this 可以操作类型任意成员
	*/
	
	//通过setParent 设置为父对象
    btn.setText("111");//设为成员变量,就不会释放
    btn.setParent(this);
    btn.move(100, 100);
	
	//通过构造函数 设置为父对象
    QPushButton* btn1 = new QPushButton(this);
    btn1->setText("222");
    btn1->move(200, 200);

}

MyWidget::~MyWidget()
{

}

04_信号和槽

基本格式是:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
connect(
&btn,//信号发出者
&QPushButton::pressed,//信号
this,//信号接收者
&MyWidget::MySlot//槽函数
);

自定义槽函数:任意的成员函数,普通全局函数,静态函数
由于信号都是没有返回值的,所以槽函数一定没有返回值

void MainWidget::MySlot()
{
btn1->setText(“123”);
}

1、一个信号可以连接多个槽函数
2、槽函数执行的顺序是随机的,不能控制
3、一个槽函数可以被多个信号连接
4、信号槽连接成功后,可以断开连接disconnect
5、槽函数可以是 lamda 表达

信号与槽:QT 对象之间通信的接口

05_两个独立的窗口(案例)

信号可以重载
信号就是函数的声明,只需要声明,无需定义

#include "widget.h"
#include <QDebug>
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText(QString("关闭"));
    b1.move(100, 100);

    b2 = new QPushButton(this);
    b2->setText("abc");

  connect(&b1, &QPushButton::pressed, this, &Widget::close);

  connect(b2, &QPushButton::released, this, &Widget::mySlot);

  connect(b2, &QPushButton::released, &b1, &QPushButton::hide);

  b3.setParent(this);
  b3.setText("切换到子窗口");
  b3.move(50, 50);

  connect(&b3, &QPushButton::released, this, &Widget::Change);

  void (SubWidget::*psub)() = &SubWidget::mySignal;
  connect(&sub1, psub, this, &Widget::Deal);
}

Widget::~Widget()
{


}

void Widget::mySlot()
{
    b2->setText("123");
}

void Widget::Change()
{
    qDebug() << "Change()" << endl;
    this->hide();
    sub1.show();
}

void Widget::Deal()
{
    qDebug() << "Change()" << endl;
    this->show();
    sub1.hide();
}

#ifndef WIDGET_H
#define WIDGET_H

#include <QPushButton>
#include <QWidget>
#include "subwidget.h"

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

public signal:
    void mySlot();
    void Change();
    void Deal();
private:
    QPushButton b1;
    QPushButton* b2;
    QPushButton b3;
    SubWidget sub1;
};

#endif // WIDGET_H

#include "subwidget.h"

SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("小弟");
    b5.setParent(this);
    b5.setText("切换至主菜单");
    b5.move(50, 50);

    connect(&b5, &QPushButton::clicked, this, &SubWidget::sendSlot);

}

void SubWidget::sendSlot()
{
    emit mySignal();
    emit mySignal(250, "I Love you");
}

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include <QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);

signals:
    /*
        信号必须有signals 关键字来声明
        信号没有返回值,但可以有参数
        信号就是函数的声明,无需定义
        使用:emit mySignal();
    */
    void mySignal();
    void mySignal(int , QString);
public slots:
    void sendSlot();
private:
    QPushButton b5;
};

#endif // SUBWIDGET_H

06_带参信号与Lamda表达式

Lamda 表达式 C++11 增加的新特性 项目文件: CONFIG += c++11
QT 配合信号一起使用,非常方便
Lamda 表达, 匿名函数对象
// = : 把外部所有局部变量,类中所有成员以值的传递方式
// this : 类中所有成员以值传递方式
// & : 把外部所有局部变量, 引用符号
若想改变外部变量的值 需要用到关键字 mutable
QPushButton *pb1 = new QPushButton(this);
pb1->setText(“ddd”);
connect(pb1, &QPushButton::released,
pb1
{
pb1->setText(“123”);
qDebug() << “123456”;
}
);

带参数的信号
如果信号存二义性(重载) => 用函数指针解决
void(subwidget:: *funSignal)() = &subwidget::mySignal;
connect(&subWin, funSignal, this, &MainWidget::dealSub);

void(subwidget:: *funSignal)(int , QString)= &subwidget::mySignal;
connect(&subWin, funSignal, this, &MainWidget::dealSlot);

int fun(int ); <=> void (*p)(int) = fun;

str.toUtf8() -> 字节数据 QByteArray
.data() -> QByteArray - > char*

QT 4=======
connect(pBtn, SIGNAL(clicked(bool)), this, SLOT(close()));
1、宏:SIGNAL 、 SLOT,会把括号内的东西当作字符串,不做安全检查
2、自定义槽函数,必须在头文件声明 public slots:
信号的参数个数可以大于槽函数参数的个数
槽函数个数不可以大于信号参数个数

07_菜单栏_工具栏(案例)

核心控件和浮动窗口

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDebug>
#include <QToolBar>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QTextEdit>
#include <QDockWidget>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(600, 400);
    //菜单栏
    QMenuBar *mBar = menuBar();

    //添加菜单--------
    QMenu *pFile = mBar->addMenu("文件");

    //添加菜单项,添加动作
    QAction *pNew = pFile->addAction("新建");

    connect(pNew, &QAction::triggered,
            [=]()
            {
                qDebug() << "I Love you";
            }
    );

    pFile->addSeparator();//分割线


    QAction *pOpen = pFile->addAction("打开");

    //工具栏
    QToolBar *toolBar = addToolBar("toolBar");
    toolBar->addAction(pNew);

    QPushButton *b = new QPushButton(this);
    b->setText("123");

    toolBar->addWidget(b);
    connect(b, &QPushButton::clicked,
                [=]()
                {
                    b->setText("456");
                }
                );

    //------------------------------------------------------------------------
    //状态栏
    QStatusBar* pStatusBar = statusBar();
    QLabel* pLabel = new QLabel(this);
    pLabel->setText("Normal text file");
    pStatusBar->addWidget(pLabel);

    //addwidget 从左往右添加
    pStatusBar->addWidget(new QLabel("2", this));

    //addPermanentWidget 从右往左添加,状态栏在右边
    pStatusBar->addPermanentWidget(new QLabel("3", this));


    //核心控件
    QTextEdit* pTextEdit = new QTextEdit(this);
    setCentralWidget(pTextEdit);


    //浮动窗口
    QDockWidget *pDock = new QDockWidget(this);
    addDockWidget(Qt::RightDockWidgetArea, pDock);
    QTextEdit* pTextEdit1 = new QTextEdit(this);
    pDock->setWidget(pTextEdit1);
}

MainWindow::~MainWindow()
{

}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

08_模态和非模态对话框(案例)

模态对话框:只能操作当前对话框
非模态对话框:相互独立,互不影响

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QDebug>
#include <QMessageBox>
#include <QFileDialog>
#include <QString>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("模态和非模态对话框");
    resize(600, 400);

    QPushButton * pBtn = new QPushButton("^-^", this);
    pBtn->setGeometry(100, 100, 200, 200);


    QMenuBar* pMenuBar = menuBar();
//    QMenu* pMenu = new QMenu(this);
//    pMenu->setTitle("文件");
//    pMenuBar->addMenu(pMenu);
    QMenu* pMenu =pMenuBar->addMenu("对话框");
    QAction* pAction = new QAction("模态", this);
    pMenu->addAction(pAction);

    connect(pAction, &QAction::triggered,
            []()
            {
                QDialog dlg;
                dlg.exec();
                qDebug() << "31";
            }
            );

    pMenu->addSeparator();//添加分隔符

    QAction* pAction1 = new QAction("非模态", this);
    pMenu->addAction(pAction1);

    connect(pAction1, &QAction::triggered,
            [this]()
            {
//                dlg1.show();

        QDialog* pDiaglog = new QDialog;
        pDiaglog->setAttribute(Qt::WA_DeleteOnClose);
                qDebug() << "45";
            }
            );

    QAction* pAction3 = new QAction("关于对话框", this);
    pMenu->addAction(pAction3);

    connect(pAction3, &QAction::triggered,
            [=]()
            {
                //QMessageBox::about(this, "about", "关于Qt");
//                  QFileDialog(this, "Open", "../");
                  QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                                  "/home",
                                                                  "Text files (*.txt);;XML files (*.xml)");
                  qDebug() << "62";
            }
            );


}

MainWindow::~MainWindow()
{
    delete ui;
}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDialog>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QDialog dlg1;
};

#endif // MAINWINDOW_H

09_常用控件

#include <QDebug>
#include<QCompleter>
#include <QStringList>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);//设置ui父窗口
    ui->pBtnClose->setText("切换");//设置按钮文本
    QString str = ui->lineEdit->text();//获取单行编辑框文本
    qDebug() << str;//应用程序输出打印
    ui->lineEdit->setText("12345678");//设置单行编辑框文本
    ui->lineEdit->setTextMargins(15, 0, 0, 0);//显示内容边距设置
    //ui->lineEdit->setEchoMode(QLineEdit::Password);//显示样式,是否设置为密码格式

    QStringList list;
    list << "hello" << "How are you" << "hehe";//默认项

    QCompleter *pCom = new QCompleter(list, this);
    pCom->setCaseSensitivity(Qt::CaseInsensitive);//不区分大小写
    ui->lineEdit->setCompleter(pCom);//单行编辑框联想词
}

下图继承关系:QObject -> QWidget -> QMainWindow
在这里插入图片描述
按钮系列:
Push Button 按钮
Tool Button 工具按钮
Radio Button 单选按钮
Check Box 复选框
Command Link Button 命令链接按钮
Dialog Button Box 按钮盒

输入部件系列:
Combo Box 下拉框(组合框)
Font Combo Box 字体下拉框
Line Edit 单行文本编辑
TextEdit 多行文本编辑,可显示图片
Plain Text Edit 纯文本编辑
Spin Box 整型微调
Double Spin Box 浮点微调
Time Edit 时间编辑
Date Edit 日期编辑
Date/Time Edit 时间、日期编辑
Dial 拨号
Horizontal Scroll Bar 水平滚动条
Vertical Scroll Bar 垂直滚动条
Horizontal Slider 水平滑块
Vertical Slider 垂直滑块
Key Sequence Edit 编辑快捷方式(按键序列编辑)

显示控件系列:
Label 标签
TextBrowser 文本浏览器
Graphics View 图形视图
Calendar 日历
LCDNumber 液晶数字(数码管)
Progress Bar 进度条
Horizontal Line 水平线
Vertical Line 垂直线
OpenGL Widget 开放式图形库工具
QQuickWidget 嵌入QML 工具
QWebView Web视图

容器组:
Group Box 组框
Scroll Area 滚动区域
ToolBox 工具箱
TabWidget 堆叠部件
Frame 帧
Widget 小部件
MdiArea MDI区域
DockWidget 停靠窗体部件
QAxWidget 封装Flash的 ActiveX控件

标签按钮

    //设置文本
    ui->label_text->setText("^_^");

    //设置图片
    //步骤:选中项目右键-》添加文件 -》 QT (QT Resource File) -》命名
    //添加了Resources image.qrc ,打开方式:右键-》Open in Edit -》修改前缀
    ui->label_Image->setPixmap(QPixmap("://Image/qq.png"));
    //让图片自动适应label的大小
    ui->label_Image->setScaledContents(true);

    //设置动画
    QMovie *myMovie = new QMovie("://Image/qq.png");
    ui->label_Gif->setMovie(myMovie);
    ui->label_Gif->setScaledContents(true);
    myMovie->start();//启动动画

    //设置链接
    ui->label_Url->setText("<h1><a href=\"https://www.cnblogs.com/tsvico/p/11877964.html\">查阅一下</a></h1>");
    ui->label_Url->setOpenExternalLinks(true);
	
	//数码管
    ui->lcdNumber->display(123);

    //进度条
    ui->progressBar->setMinimum(0);
    ui->progressBar->setMaximum(200);
    ui->progressBar->setValue(100);

10_布局

绝对位置布局,相对位置布局
ctrl + H 水平布局
ctrl + L 垂直布局
alt + shift + r 预览
弹簧协助布局,编辑其属性
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

11_自定义控件

1、在原有的项目上创建一个类,右键项目,添加一个 C++ clas, 选择基类 QWidget ,命名为smallwidget
2、在ui界面拖拽一个容器Widget,选择,右键将其提升为smallwidget

#include "smallwidget.h"
#include <QSpinBox>
#include <QSlider>
#include <QHBoxLayout>

SmallWidget::SmallWidget(QWidget *parent) : QWidget(parent)
{
    QSpinBox *pSpin = new QSpinBox(this);
    QSlider *pSlider = new QSlider(Qt::Horizontal, this);

    QHBoxLayout *pLayout = new QHBoxLayout(this);
    pLayout->addWidget(pSpin);
    pLayout->addWidget(pSlider);

    connect(pSpin, static_cast<void (QSpinBox::*) (int)>(&QSpinBox::valueChanged), pSlider, &QSlider::setValue);
    connect(pSlider, static_cast<void (QSlider::*) (int)>(&QSlider::sliderMoved), pSpin, &QSpinBox::setValue);
}

在这里插入图片描述
在这里插入图片描述

12_Qt 样式表

Qt样式表 与 CSS 的语法规则几乎完全相同
通过调用:QWidget::setStyleSheer() 或 QApplication::setStyleSheet()

案例1:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setStyleSheet("QLabel{color:rgb(255, 255, 255);"
                              "background-color:red;"
                              "}");

    ui->label->setStyleSheet("QLabel{color:rgb(255, 255, 255);"
                              "background-color:blue;"
                              "}");
}

MainWindow::~MainWindow()
{
    delete ui;
}

在这里插入图片描述

案例2:

#include "mymainwindow.h"
#include "ui_mymainwindow.h"

MyMainWindow::MyMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MyMainWindow)
{
    ui->setupUi(this);

    ui->pushButton->setStyleSheet("QPushButton{"
                                  "border-image:url(://Image/a.jpg);"
                                  "}"

                                  "QPushButton:hover{"
                                  "border-image:url(://Image/b.jpg);"
                                  "}"

                                  "QPushButton:pressed{"
                                  "border-image:url(://Image/c.jpg);"
                                  "}"
                                );
}

MyMainWindow::~MyMainWindow()
{
    delete ui;
}

在这里插入图片描述

13_事件

1、Qt 中所有的时间类都继承于QEvent
2、event() 函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)
索引:帮助-》索引(搜索QT类)

事件处理器:
1)都是虚函数(基类中定义QWidget QObject)
2)我们派生类(子类)只是重写这些虚函数(虚函数必须和基类中的虚函数一致)

定义函数的快捷键: Alt + Enter / Enter

以鼠标点击,移动,释放为例:

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QLabel>
#include <QMouseEvent>
#include <QDebug>
class MyLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent *ev);//鼠标点击
    void mouseReleaseEvent(QMouseEvent *ev);//鼠标释放
    void mouseMoveEvent(QMouseEvent *ev);//鼠标移动

signals:

public slots:
};

#endif // MYLABEL_H

#include "mylabel.h"

MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{

}

void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    int iXPos = ev->x();
    int iYPos = ev->y();
    //sprintf
    /*
        QString str = QString("abc %1 ^_^ %2").arg(123).arg("make");
        str = abc 123 ^_^ make
    */

   if(ev->button() == Qt::LeftButton)
   {
        qDebug() << "左键按下";
   }
   else  if(ev->button() == Qt::RightButton)
   {
       qDebug() << "右键按下";
   }
   else
   {
       qDebug() << "中间按下";
   }

    QString QStrText = QString("<h1><center>Mouse Press: (%1, %2)</h1></center>").arg(iXPos).arg(iYPos);
    this->setText(QStrText);
}


void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{

}

void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{


}

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    void keyPressEvent(QKeyEvent *);//键盘按键按下ASCII
    void timerEvent(QTimerEvent *);//定时器

private:
    Ui::MainWindow *ui;
    int iTimeID;
};

#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    iTimeID =  this->startTimer(1000);//毫秒为单位,每隔1s 触发一次定时器
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::keyPressEvent(QKeyEvent *e)
{
    qDebug() << e->key();
    switch (e->key())
    {
        case Qt::Key_Alt :
            qDebug() << "Alt Pressed";
        break;

    }
}


void MainWindow::timerEvent(QTimerEvent *event)
{
    static int sec = 0;
    sec++;
    ui->label->setText(QString("<h1><center>Time out: (%1)</h1></center>").arg(sec));

    if(5 == sec)
    {
        this->killTimer(iTimeID);//关闭定时器
    }

}

在这里插入图片描述

14_事件的接收与忽略

创建一个MyButton 类, 在ui 界面拖拽一个按钮,并且提升为 MyButton

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QMouseEvent>

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent* event);

signals:

public slots:
};

#endif // MYBUTTON_H

#include "mybutton.h"
#include <QDebug>

MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{

}

void MyButton::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton)
    {
        //如果是左键
        qDebug() << "按下的是左键" ;
        //事件接收后,就会往下传递

        event->ignore();//忽略,事件继续往下传递,给谁传递?
                                   //事件传递给了父组件(QWidget),不是给父类(基类)
    }
//    else
//    {
//        //不做处理
//        QPushButton::mousePressEvent(event);
//        //事件的忽略,事件继续往下传递
//    }
    QPushButton::mousePressEvent(event);
}

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    iTimeID =  this->startTimer(1000);//毫秒为单位,每隔1s 触发一次定时器

    QObject::connect(ui->pushButton, &MyButton::clicked,
                     [=]()
                    {
                        qDebug() << "按钮被按下" << endl;
                    }
    );

}

event()
事件对象创建完成后,Qt 将这个事件对象传递给QObject 的 event() 函数
event() 函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,
分发给不同的事件处理器(event handler)

bool event(QEvent* e);

bool MainWindow::event(QEvent *e)
{
    //事件分发
    if(e->type() == QEvent::Timer)
    {
        qDebug() << "---------";
        //如果返回true , 事件停止传播
        return true;
    }
    else
    {
        return QWidget::event(e);
    }
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐