文章目录
一、状态栏,核心控件,浮动窗口
1. 状态栏
2. 核心控件
3. 浮动窗口
二、代码(菜单栏,工具栏,状态栏,核心空间,浮动窗口)
1. 项目文件 —— day4_QMainWindow.pro
2. 主窗口头文件 —— mainwindow.h
3. 主窗口源文件 —— mainwindow.cpp
三、模态和非模态对话框
1. 模态对话框
2. 非模态对话框
四、标准对话框和文件对话框
1. 标准对话框
1.1 关于对话框
1.2 问题对话框
2. 文件对话框
五、代码(模态和非模态对话框,标准对话框,文件对话框)
1. 项目文件 —— day5.pro
2. 主窗口头文件 —— mainwindow.h
3. 主窗口源文件 —— mainwindow.cpp
由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。
提示:具体项目创建流程和注意事项见
QT 学习笔记(一)
提示:具体项目准备工作和细节讲解见
QT 学习笔记(二)
一、状态栏,核心控件,浮动窗口
1. 状态栏
addWidget 从左往右依次添加。
具体函数为 sBar -> addWidget ( new QLabel ( " 2 " , this ) ) 。
addPermanentWidget 从右往左依次添加。
具体函数为 sBar -> addPermanentWidget ( new QLabel ( " 3 " , this ) )
2. 核心控件
- 主要功能是创建一个文本编辑区。
- setCentralWidget ( 指针变量 ) 。
3. 浮动窗口
知识点补充:快速查看函数需要哪些参数,可以将在括号内编辑时,将光标置于其中,就会出现函数所需的参数,有些函数有多种写法,可以使用方向键上和下进行切换。具体情况如下图所示:
addDockWidget ( Qt :: RightDockWidgetArea , dock ) 第一个参数是放置的区域,第二个参数是放置的是谁。
- 需要注意的是,工具栏和浮动窗口都可以人为鼠标对其进行拖动调位。
二、代码(菜单栏,工具栏,状态栏,核心空间,浮动窗口)
1. 项目文件 —— day4_QMainWindow.pro
#------------------------------------------------- # # Project created by QtCreator 2022-11-27T20:58:28 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = day4_QMainWindow TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 CONFIG += c++11 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target CONFIG += C++11
2. 主窗口头文件 —— mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H
3. 主窗口源文件 —— mainwindow.cpp
#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) { //菜单栏 QMenuBar *mbar = menuBar(); //添加菜单 QMenu *pfile = mbar->addMenu("文件"); //添加菜单项,添加动作 QAction *pnew = pfile->addAction("新建"); connect(pnew,&QAction::triggered, [=]() { qDebug()<<"新建被按下"; } ); pfile->addSeparator(); // 添加分割线 QAction *popen = pfile->addAction("打开"); //工具栏,菜单栏的快捷方式 QToolBar *toolbar = addToolBar("toolbar"); //工具栏添加快捷键 toolbar->addAction(pnew); QPushButton *b = new QPushButton(this); b->setText("^_^"); //添加小控件 toolbar->addWidget(b); connect(b,&QPushButton::clicked, [=]() { b->setText("123"); } ); //状态栏 QStatusBar *sBar = statusBar(); QLabel *label = new QLabel(this); label->setText("normal text file"); sBar->addWidget(label); // addWidget 从左往右依次添加 sBar->addWidget(new QLabel("2",this)); // addPermanentWidget 从右往左依次添加 sBar->addPermanentWidget(new QLabel("3",this)); //核心控件 QTextEdit *textedit = new QTextEdit(this); setCentralWidget(textedit); //浮动窗口 QDockWidget *dock = new QDockWidget(this); addDockWidget(Qt::RightDockWidgetArea,dock); QTextEdit *textedit1 = new QTextEdit(this); dock->setWidget(textedit1); // 定义窗口大小 resize(400,300); } MainWindow::~MainWindow() { }
三、模态和非模态对话框
- 生成一个新的项目,具体步骤过程见提示。
- 在进行模态对话框和非模态对话框之前,我们需要先编写一个菜单栏,使其包含模态对话框和非模态对话框两个选项。
1. 模态对话框
对于模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序下的其他窗口进行交互,直到该对话框关闭,比如记事本的另存为窗口。如下图情况所示,打开模态对话框后,就不能在对该应用程序下的其他窗口进行操作了。
dlg.exec() 帮助实现模态对话框,exec() 会使得程序停留在这里等待我们进行操作,当我们操作完后,才会执行之后的程序,即输出 111111 。
2. 非模态对话框
对于非模态对话框就是当其被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互,比如记事本上帮助内的反馈窗口。如下图情况所示,打开非模态对话框后,仍可以在对该应用程序下的其他窗口进行操作了。
dlg.show() 帮助实现非模态对话框,show() 只会展现窗口,展现之后,程序便会向后继续运行,即输出 222222 。
- 在 show() 使用过程当中,我们也需要注意,不能使用局部变量。
- 此处,建议在对应头文件当中进行变量的定义,如下图所示:
四、标准对话框和文件对话框
- 在进行标准对话框和文件对话框之前,我们需要继续对菜单栏进行编写,使其除了包含模态对话框和非模态对话框两个选项之外,还包含标准对话框和文件对话框两个选项。
1. 标准对话框
1.1 关于对话框
- QMessageBox::about(this,“about”,“关于QT”) 第一个参数是父对象,第二个参数是标题,第三个参数是内容。
- 结果如下图所示,会自动生成一个 OK 按钮。
1.2 问题对话框
QMessageBox::question(this,“question”,“Are you OK?”) 第一个参数是父对象,第二个参数是标题,第三个参数是内容。
结果如下图所示,会自动生成一个 YES 和 NO 两个按钮。
此时,我们要设定按钮的返回值,才可以知道我们具体使用的是哪个按钮。
对于按钮的内容,我们可以使用标准,就是 YES 和 NO ,也可以自定义一下。下方代码展示的是标准的 YES 和 NO 。(在最终代码当中都会两种方法方式都会体现)
int ret = QMessageBox::question(this,"question","Are you OK?"); switch (ret) { case QMessageBox::Yes: qDebug()<<"I am OK."; break; case QMessageBox::No: qDebug()<<"I am bad."; break; default: break; }
2. 文件对话框
- QString path = QFileDialog::getOpenFileName(this,“open”,“…/”) 具有返回值,第一个参数是父对象,第二个参数是标题,第三个参数是路径。
- 当我么你点击文本对话框时,会让我选择文件路径,选择后,会打印出该文件的路径。
- 我们会发现,这样子我们发现想要打开我们需要的文件格式不能直接选取,那么,有限定打开文件格式的方法吗?
- 答案是肯定的,代码和最后结果如下图所示:
五、代码(模态和非模态对话框,标准对话框,文件对话框)
1. 项目文件 —— day5.pro
#------------------------------------------------- # # Project created by QtCreator 2022-11-27T20:58:28 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = day4_QMainWindow TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which has been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 CONFIG += c++11 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target CONFIG += C++11
2. 主窗口头文件 —— mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QDialog> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); QDialog dlg; }; #endif // MAINWINDOW_H
3. 主窗口源文件 —— mainwindow.cpp
#include "mainwindow.h" #include <QMenu> #include <QMenuBar> #include <QAction> #include <QDebug> #include <QDialog> #include <QMessageBox> #include <QFileDialog> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QMenuBar *mBar = menuBar(); setMenuBar(mBar); QMenu *menu = mBar->addMenu("对话框"); // 模态对话框 QAction *p1 = menu->addAction("模态对话框"); connect(p1,&QAction::triggered, [=]() { QDialog dlg; dlg.exec(); qDebug()<<"111111"; } ); // 非模态对话框 QAction *p2 = menu->addAction("非模态对话框"); connect(p2,&QAction::triggered, [=]() { dlg.show(); qDebug()<<"222222"; } ); // 关于对话框 QAction *p3 = menu->addAction("关于对话框"); connect(p3,&QAction::triggered, [=]() { QMessageBox::about(this,"about","关于QT"); } ); // 问题对话框 QAction *p4 = menu->addAction("问题对话框"); connect(p4,&QAction::triggered, [=]() { int ret = QMessageBox::question (this,"question","Are you OK?", QMessageBox::Ok|QMessageBox::Cancel); switch (ret) { //case QMessageBox::Yes: case QMessageBox::Ok: qDebug()<<"I am OK."; break; //case QMessageBox::No: case QMessageBox::Cancel: qDebug()<<"I am bad."; break; default: break; } } ); // 文件对话框 QAction *p5 = menu->addAction("文件对话框"); connect(p5,&QAction::triggered, [=]() { QString path = QFileDialog::getOpenFileName (this,"open","../", "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"); qDebug() << path; } ); } MainWindow::~MainWindow() { }