当前位置:网站首页>Qt学习27 应用程序中的主窗口
Qt学习27 应用程序中的主窗口
2022-07-07 04:31:00 【一个小黑酱】
Qt学习27 应用程序中的主窗口
主窗口的概念
应用程序中的主窗口
- 主窗口是与用户 进行长时间交互的顶层窗口
- 程序的 绝大多数功能 直接由主窗口提供
- 主窗口通常是 应用程序启动后显示的第一个窗口
- 整个程序由一个主窗口和 多个对话框 组成
Qt 中的主窗口
- Qt 开发平台中直接支持主窗口的概念
QMainWindow是 Qt 中主窗口的基类QMainWindow继承于QWidget是一种 容器类型 的组件

QMainWindow中封装的秘密

QMainWindow中的组件布局

- 在 Qt 中提供与菜单相关的类组件

- 在 Qt 主窗口中创建菜单
QMenuBar* mb = menuBar(); // member function
QMenu* menu = new QMenu("File(&F)");
QAction* action = new QAction("New", NULL);
menu->addAction(action);
mb->addMenu(menu);
编程实验 - 主窗口中创建菜单
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QAction>
#include <QMenu>
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
MainWindow();
bool construct();
bool initMenuBar();
bool initFileMenu(QMenuBar* mb);
bool initEditMenu(QMenuBar* mb);
bool initFormatMenu(QMenuBar* mb);
bool initViewMenu(QMenuBar* mb);
bool initHelpMenu(QMenuBar* mb);
bool makeAction(QAction*& action, QString text, int key=0);
bool myAddAction(QMenu* menu, QString text, int key=0);
public:
static MainWindow* NewInstance();
~MainWindow();
};
#endif // MAINWINDOW_H
#include "MainWindow.h"
#include <QMenuBar>
#include <QMenu>
MainWindow::MainWindow()
{
}
bool MainWindow::construct()
{
bool ret = true;
ret = initMenuBar();
return ret;
}
bool MainWindow::initMenuBar()
{
bool ret = true;
QMenuBar* mb = menuBar();
ret = ret && initFileMenu(mb);
ret = ret && initEditMenu(mb);
ret = ret && initFormatMenu(mb);
ret = ret && initViewMenu(mb);
ret = ret && initHelpMenu(mb);
return ret;
}
bool MainWindow::initFileMenu(QMenuBar* mb)
{
bool ret = true;
QMenu* menu = new QMenu("File(&F)");
ret = (menu != NULL);
if (ret) {
ret = ret && myAddAction(menu, "New(N)", Qt::CTRL + Qt::Key_N);
ret = ret && myAddAction(menu, "New Window(W)", Qt::CTRL + Qt::SHIFT + Qt::Key_N);
ret = ret && myAddAction(menu, "Open(O)", Qt::CTRL + Qt::Key_O);
ret = ret && myAddAction(menu, "Save(S)", Qt::CTRL + Qt::Key_S);
ret = ret && myAddAction(menu, "Save as(S)", Qt::CTRL + Qt::SHIFT + Qt::Key_S);
menu->addSeparator();
ret = ret && myAddAction(menu, "Page setting(U)");
ret = ret && myAddAction(menu, "Print(P)", Qt::CTRL + Qt::Key_P);
menu->addSeparator();
ret = ret && myAddAction(menu, "Exit(X)", Qt::CTRL + Qt::Key_X);
}
if (ret) {
mb->addMenu(menu);
}
else {
delete menu;
}
return ret;
}
bool MainWindow::initEditMenu(QMenuBar *mb)
{
bool ret = true;
QMenu* menu = new QMenu("Edit(&E)");
ret = (menu != NULL);
if (ret) {
ret = ret && myAddAction(menu, "Undo(U)", Qt::CTRL + Qt::Key_Z);
ret = ret && myAddAction(menu, "Clip(T)", Qt::CTRL + Qt::Key_X);
ret = ret && myAddAction(menu, "Copy(C)", Qt::CTRL + Qt::Key_C);
ret = ret && myAddAction(menu, "Stick(C)", Qt::CTRL + Qt::Key_V);
ret = ret && myAddAction(menu, "Delete(L)", Qt::Key_Delete);
menu->addSeparator();
ret = ret && myAddAction(menu, "Use Bing search", Qt::CTRL + Qt::Key_E);
ret = ret && myAddAction(menu, "Find(F)", Qt::CTRL + Qt::Key_F);
ret = ret && myAddAction(menu, "Find next(N)", Qt::Key_F3);
ret = ret && myAddAction(menu, "Find pre(V)", Qt::SHIFT + Qt::Key_F3);
ret = ret && myAddAction(menu, "Replace(R)", Qt::CTRL + Qt::Key_H);
ret = ret && myAddAction(menu, "Replace(R)", Qt::CTRL + Qt::Key_H);
ret = ret && myAddAction(menu, "Jump(G)", Qt::CTRL + Qt::Key_G);
menu->addSeparator();
ret = ret && myAddAction(menu, "Select all(A)", Qt::CTRL + Qt::Key_A);
ret = ret && myAddAction(menu, "Data(D)", Qt::Key_F5);
}
if (ret) {
mb->addMenu(menu);
}
else {
delete menu;
}
return ret;
}
bool MainWindow::initFormatMenu(QMenuBar *mb)
{
bool ret = true;
QMenu* menu = new QMenu("Format(&O)");
ret = (menu != NULL);
if (ret) {
ret = ret && myAddAction(menu, "Auto wrap(W)");
ret = ret && myAddAction(menu, "Font(F)");
}
if (ret) {
mb->addMenu(menu);
}
else {
delete menu;
}
return ret;
}
bool MainWindow::initViewMenu(QMenuBar *mb)
{
bool ret = true;
QMenu* menu = new QMenu("View(&V)");
ret = (menu != NULL);
if (ret) {
ret = ret && myAddAction(menu, "Zoom(Z)");
ret = ret && myAddAction(menu, "Status bar(S)");
}
if (ret) {
mb->addMenu(menu);
}
else {
delete menu;
}
return ret;
}
bool MainWindow::initHelpMenu(QMenuBar *mb)
{
bool ret = true;
QMenu* menu = new QMenu("Help(&H)");
ret = (menu != NULL);
if (ret) {
ret = ret && myAddAction(menu, "View Help(H)");
ret = ret && myAddAction(menu, "Send feedback(F)");
ret = ret && myAddAction(menu, "About App(A)");
}
if (ret) {
mb->addMenu(menu);
}
else {
delete menu;
}
return ret;
}
bool MainWindow::makeAction(QAction *&action, QString text, int key)
{
bool ret = true;
action = new QAction(text, NULL);
if (action != NULL) {
if (key != 0) {
action->setShortcut(QKeySequence(key));
}
}
else {
ret = false;
}
return ret;
}
bool MainWindow::myAddAction(QMenu *menu, QString text, int key)
{
bool ret = true;
QAction* action = NULL;
ret = makeAction(action, text, key);
if (ret) {
menu->addAction(action);
}
return ret;
}
MainWindow *MainWindow::NewInstance()
{
MainWindow* ret = new MainWindow();
if ((ret == NULL) || !ret->construct()) {
delete ret;
ret = NULL;
}
return ret;
}
MainWindow::~MainWindow()
{
}
#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow* w = MainWindow::NewInstance();
int ret = -1;
if (w != NULL) {
w->show();
ret = a.exec();
}
return ret;
}
小技巧
快捷键设置
action->setShort(QKeySequence(KEY))QKeySequence- Qt 中与 快捷键 相关的类KEY- Qt 中代表 键值 的常量
小结
- 主窗口是与用户 进行长时间交互的顶层窗口
- 主窗口通常是 应用程序启动后显示的第一个窗口
QMainWindow是 Qt 中主窗口的基类QMainWindow是一种 容器类型 的窗口组件QMainWindow中封装了菜单栏,工具栏,状态栏等组件
边栏推荐
- SQL优化的魅力!从 30248s 到 0.001s
- [webrtc] m98 Screen and Window Collection
- [UTCTF2020]file header
- 《动手学深度学习》(四) -- 卷积神经网络 CNN
- 242. Bipartite graph determination
- 2022茶艺师(初级)考试题模拟考试题库及在线模拟考试
- gslx680触摸屏驱动源码码分析(gslX680.c)
- [performance pressure test] how to do a good job of performance pressure test?
- After 95, Alibaba P7 published the payroll: it's really fragrant to make up this
- Operation suggestions for today's spot Silver
猜你喜欢
随机推荐
JSON introduction and JS parsing JSON
Six methods of flattening arrays with JS
Regular e-commerce problems part1
1142_ SiCp learning notes_ Functions and processes created by functions_ Linear recursion and iteration
微信小程序中的路由跳转
即刻报名|飞桨黑客马拉松第三期等你挑战
Is the test cycle compressed? Teach you 9 ways to deal with it
Figure out the working principle of gpt3
Button wizard script learning - about tmall grabbing red envelopes
[mathematical notes] radian
Rust Versus Go(哪种是我的首选语言?)
【Unity】物体做圆周运动的几个思路
【webrtc】m98 screen和window采集
Problem solving: unable to connect to redis
Iterable、Collection、List 的常见方法签名以及含义
Solve could not find or load the QT platform plugin "xcb" in "
[UVM practice] Chapter 2: a simple UVM verification platform (2) only driver verification platform
leetcode:105. Constructing binary trees from preorder and inorder traversal sequences
Detailed explanation of Kalman filter for motion state estimation
242. Bipartite graph determination



![[unity] several ideas about circular motion of objects](/img/84/e70c6696629dbe17ace011553f43ff.png)





