当前位置:网站首页>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
中封装了菜单栏,工具栏,状态栏等组件
边栏推荐
- 科技云报道:从Robot到Cobot,人机共融正在开创一个时代
- 【Unity】物体做圆周运动的几个思路
- [UVM practice] Chapter 2: a simple UVM verification platform (2) only driver verification platform
- Jenkins remote build project timeout problem
- Rust Versus Go(哪种是我的首选语言?)
- [Stanford Jiwang cs144 project] lab3: tcpsender
- KBU1510-ASEMI电源专用15A整流桥KBU1510
- 1141_ SiCp learning notes_ Functions abstracted as black boxes
- The configuration that needs to be modified when switching between high and low versions of MySQL 5-8 (take aicode as an example here)
- Leetcode sword finger offer brush questions - day 20
猜你喜欢
即刻报名|飞桨黑客马拉松第三期等你挑战
1141_ SiCp learning notes_ Functions abstracted as black boxes
mysql多列索引(组合索引)特点和使用场景
Idea add class annotation template and method template
Technology cloud report: from robot to Cobot, human-computer integration is creating an era
Write CPU yourself -- Chapter 9 -- learning notes
开源生态|打造活力开源社区,共建开源新生态!
Why should we understand the trend of spot gold?
nacos
Problem solving: unable to connect to redis
随机推荐
Route jump in wechat applet
PHP exports millions of data
Make a bat file for cleaning system garbage
CentOS7下安装PostgreSQL11数据库
IO流 file
开源生态|打造活力开源社区,共建开源新生态!
即刻报名|飞桨黑客马拉松第三期等你挑战
[experience sharing] how to expand the cloud service icon for Visio
LeetCode 90:子集 II
Solve could not find or load the QT platform plugin "xcb" in "
直播平台源码,可折叠式菜单栏
微信小程序中的路由跳转
Gslx680 touch screen driver source code analysis (gslx680. C)
Flutter riverpod is comprehensively and deeply analyzed. Why is it officially recommended?
leetcode:105. Constructing binary trees from preorder and inorder traversal sequences
buuctf misc USB
Installing postgresql11 database under centos7
Pytest+allure+jenkins installation problem: pytest: error: unrecognized arguments: --alluredir
Info | webrtc M97 update
2022茶艺师(初级)考试题模拟考试题库及在线模拟考试