官方:
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,我们的MainWindow在UI范围内。此外,在标题中,我们将指向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
与我们的新对话框相关的新文件已创建:
让我们为触发的事件输入正确的代码。
我们将以两种类型打开新对话框:modal和modaless。
模态对话框
#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
现在,非模式对话框不会消失。