QT5 主窗口QMainWindow和操作 模态非模态对话框

官方:
https://doc.qt.io/qt-6/qmainwindow.html
https://doc.qt.io/qt-6/qtwidgets-mainwindows-application-example.html

主窗口和操作

在本教程中,我们将学习如何从主窗口类的菜单和工具栏设置操作。

文件->新建文件或项目…

应用程序->Qt Gui 应用程序->选择…

默认情况下,我们将类保留为MainWindow

点击下一步。

点击完成。

这是main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}

在高亮行中,我们有一个MainWindow类的事件。

这是头文件:mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

请注意,我们有一个命名空间UI,我们的MainWindowUI范围内。此外,在标题中,我们将指向UI::MainWindow的指针声明为私有成员ui

让我们通过双击mainwindow.ui来打开Designer以放置菜单栏和操作。在顶部菜单中输入“文件”,在“文件”菜单下输入“新窗口…”。我们需要按 Enter 来对菜单进行真正的更改。请注意,在底部的动作编辑器中,已经创建了一个名为actionNew_Window的新动作。

我们还可以将actionNew_Window操作菜单拖放到工具栏中:

现在,我们有两个地方可以触发actionNew_Window动作。

单击动作编辑器上的动作,然后选择“转到插槽…”。

它允许我们触发一个事件。选择triggered()并点击确定。

然后,Creator 将自动显示代码 ( mainwindow.cpp ) 中的更改:

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

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

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

void MainWindow::on_actionNew_Window_triggered()
{
    
}

因此,每当我们单击工具栏项或菜单项时,都会触发此事件。

如果我们运行代码,我们会得到:

当我们单击New Window时,什么也没有发生。这是因为我们没有在MainWindow::on_actionNew_Window_triggered()方法中添加任何内容。

打开由操作触发的对话框

右键单击 MainWindowAction 项目->Add New->Qt->Qt Designer Form Class->Dialog without Buttons

与我们的新对话框相关的新文件已创建:

让我们为触发的事件输入正确的代码。
我们将以两种类型打开新对话框:modalmodaless

模态对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mydialog.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

void MainWindow::on_actionNew_Window_triggered()
{
    MyDialog mDialog;
    mDialog.setModal(true);
    mDialog.exec();
}

如果我们运行它,我们会得到模态类型对话框:

非模式对话框

为了获得无模式,我们编辑了mainwindow.cpp如下:

void MainWindow::on_actionNew_Window_triggered()
{
    MyDialog mDialog;
    /*
    mDialog.setModal(false);
    mDialog.exec();
    */
    mDialog.show();
}

但它一被创建就消失了。这是因为与模态类型对话框不同,模态对话框将控制权交给主应用程序,堆栈变量在退出on_actionNew_Window_triggered()时消失。所以,我们需要设置一个指针作为MainWindow类的成员:

mainwindow.cpp

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

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

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

void MainWindow::on_actionNew_Window_triggered()
{
    mDialog = new MyDialog(this);
    mDialog->show();
}

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mydialog.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private slots:
    void on_actionNew_Window_triggered();

private:
    Ui::MainWindow *ui;
    MyDialog *mDialog;
};

#endif // MAINWINDOW_H

现在,非模式对话框不会消失。

分类: C++标签: