qt exec 跟show的区别

1、要理清两个函数的区别,首先需要理解窗口模式:

模式窗口:窗口会原地阻塞,只能操作该窗口,其余窗口不能再操作;只有关闭该窗口后,代码处才会获得返回值,阻塞停止,就可以操作其它界面了;
半模式窗口:窗口会原地伪阻塞,虽然也是只能操作该窗口,其余窗口不能再操作,但是代码会继续往下运行,所以说是伪阻塞;
非模式窗口:窗口不会阻塞,可以随意操作;
2、exec()和show()的区别
exec()一般用于子窗口界面,在执行完后就会析构掉子窗口,不会占用系统资源。show()一般是用于与主窗口同步显示的界面。会跟主窗口同时存在。
QDialog* Dlg = new QDialog(this); Dlg->exec(); 模式窗口
QDialog* Dlg = new QDialog(this); Dlg->setModal(true); Dlg->show(); 半模式窗口
QDialog* Dlg = new QDialog(this); Dlg->show(); 非模式窗口

3、如何使用
qt 类中继承:public QDialog即可用exec()函数。
以下两组代码都会出现dlg窗口,但代码1是执行完show()后,会回到主界面执行,而代码2会阻塞到exec()函数上,执行窗口的事件,等待dlg窗口调用close()才会退出此函数。

    myDlg *Dlg =new myDlg(this);
    Dlg->show();

    myDlg Dlg(this);
    Dlg.exec();




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
9.1事件机制与原理分析 9.1.1 什么是Qt事件驱动?         我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码: int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } 有点抽象,Qt进行了封装        实际上a.exec()便是Qt程序进入事件消息循环, 9.1.2 图形界面应用程序的消息处理模型 回调、os的魔抓windows、linux,从用户层到 内核层,如何管理进程、线程、 Os如何处理、底层机制 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的  系统内核的消息通过事件处理转变成QT的信号 9.1.3 Qt中的事件处理 (1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.              事件处理的核心包括事件①产生、②分发、③接受和处理 ①事件的产生 谁来产生事件? 最容易想到的是我们的输入设备,比如键盘、鼠标产生的 keyPressEvent,keyReleaseEvent, mousePressEvent,mouseReleaseEvent事件 (被封装成QMouseEvent和QKeyEvent)。 ②Qt中事件的分发 谁来负责分发事件? 对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver.  对于Qt GUI程序,由QApplication来负责   ③事件的接受和处理 谁来接受和处理事件? 答案是QObject。 类是整个Qt对象模型的心脏,事件处理机制是QObject三大职责( 内存管理、内省intropection、事件处理制)之一。 任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。 9.1.4 QObject的内省机制
Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MyObj; class MyObj : public QObject { Q_OBJECT public: MyObj(); //新的线程 signals: void toLine(QString line); private slots: void doWork(); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void appendText(QString); //定义一个槽 private: Ui::MainWindow *ui; QThread *t; MyObj *obj; }; #endif // MAINWINDOW_H 而MAIN主文件的内容为了防止中文乱码做了如下修改: #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //设置中文字体 防止乱码 a.setFont(QFont("Microsoft Yahei", 9)); //设置中文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif MainWindow w; w.show(); return a.exec(); } 接下来重点来了,源文件CPP里为 #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); t = new QThread(); //QThread obj = new MyObj(); obj->moveToThread(t); qDebug()<<"main thread:"<<QThread::currentThread(); connect(t,SIGNAL(started()), obj, SLOT(doWork())); connect(obj,SIGNAL
1、首先,先创建一个新文件,并在里面添加新的Qt设计界面 可以得到如图,mainwindow是主界面,widget是我新添加的子界面 2、注意将子界面的.h文件添加主界面的.h中 3、在主界面的.h中,添加子界面的变量及打开子界面和处理子界面信号的函数(在主ui中创建按钮) 4、在子界面.h文件中,添加打开主界面函数和信号(在子ui中创建按钮) 5、在主界面.cpp中连接信号和槽,及对应函数 6、在子界面.cpp中,写相关函数和信号 最终结果: 主界面和子界面间,通过按钮进行相互切换~ 下面附上源码: Mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "widget.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_pushButton_clicked(); void dealslot(); private: Ui::MainWindow *ui; widget wid; }; #endif // MAINWINDOW_H Widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class widget; } class widget : public QWidget { Q_OBJECT public: explicit widget(QWidget *parent = nullptr); ~widget(); private slots: void on_pushButton_clicked(); signals: void ChangeUiSlot(); private: Ui::widget *ui; }; #endif // WIDGET_H Mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "widget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //connect(&wid,SIGNAL(ChangeUiSlot()),this,SLOT(dealslot())); connect(&wid,&widget::ChangeUiSlot,this,&MainWindow::dealslot); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() { this->hide(); wid.show(); } void MainWindow::dealslot() { this->show(); wid.hide(); } Widget.cpp #include "widget.h" #include "ui_widget.h" widget::widget(QWidget *parent) : QWidget(parent), ui(new Ui::widget) { ui->setupUi(this); } widget::~widget() { delete ui; } void widget::on_pushButton_clicked() { emit ChangeUiSlot(); } Main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值