QT学习(第一部分)
01_QT介绍QT =》 GUI 编程 =》 图形界面如何学习Qt ?=》 多看Qt 帮助文档(F:\Qt_system\5.12.3\mingw73_32\bin\assistant.exe)1991年由奇趣科技开发1996年进入商业领域Linux(gnome、桌面环境KDE基础)2008年奇趣公司被诺基亚公司收购2012年Qt 又被微软公司收购创建一个工程步骤:打开Qt Creator / 文
文章目录
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);
}
}
更多推荐


所有评论(0)