当前位置:网站首页>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
中封装了菜单栏,工具栏,状态栏等组件
边栏推荐
- 2022-07-06:以下go语言代码是否会panic?A:会;B:不会。 package main import “C“ func main() { var ch chan struct
- 大视频文件的缓冲播放原理以及实现
- Problem solving: unable to connect to redis
- 【webrtc】m98 screen和window采集
- SQL优化的魅力!从 30248s 到 0.001s
- CentOS7下安装PostgreSQL11数据库
- 解决could not find or load the Qt platform plugin “xcb“in ““.
- Tencent's one-day life
- Sign up now | oar hacker marathon phase III, waiting for your challenge
- The metauniverse of the platofarm farm continues to expand, with Dao governance as the core
猜你喜欢
Numbers that appear only once
IO stream file
Operation suggestions for today's spot Silver
知识点滴 - 关于苹果认证MFI
LeetCode 90:子集 II
Detailed explanation of Kalman filter for motion state estimation
Mysql高低版本切换需要修改的配置5-8(此处以aicode为例)
[unity] several ideas about circular motion of objects
自定义类加载器加载网络Class
Tencent's one-day life
随机推荐
Button wizard script learning - about tmall grabbing red envelopes
Button wizard collection learning - mineral medicine collection and running map
[UVM basics] summary of important knowledge points of "UVM practice" (continuous update...)
CTF daily question day43 rsa5
A bit of knowledge - about Apple Certified MFI
Solution: could not find kf5 (missing: coreaddons dbusaddons doctools xmlgui)
Value sequence (subsequence contribution problem)
Info | webrtc M97 update
[GUET-CTF2019]虚假的压缩包
Determining the full type of a variable
【webrtc】m98 screen和window采集
Pytest+allure+jenkins environment -- completion of pit filling
Leetcode-543. Diameter of Binary Tree
Figure out the working principle of gpt3
解决:Could NOT find KF5 (missing: CoreAddons DBusAddons DocTools XmlGui)
Codeforces Global Round 19
Leanote private cloud note building
Detailed explanation of uboot image generation process of Hisilicon chip (hi3516dv300)
[UVM practice] Chapter 2: a simple UVM verification platform (2) only driver verification platform
gatk4中的interval是什么??