主窗口 (QMainWindow)
一. 主窗口概念
-
主窗口是与用户进行长时间交互的顶层窗口
-
程序的绝大多数功能直接由主窗口提供
-
主窗口通常是应用程序启动后显示的第一个窗口
-
整个程序由一个主窗口和多个对话框组成
二. Qt中的主窗口(QMainWindow)
- QMainWindow是Qt中主窗口的基类
- QMainWindow继承于QWidget,是一种容器类型的组件
- QMainWindow中的组件布局
三. 主窗口中的菜单
-
和菜单相关的组件
-
在Qt窗口中创建菜单
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QKeySequence> #include <QMenuBar> #include <QAction> class MainWindow : public QMainWindow { Q_OBJECT private: MainWindow(); MainWindow(const MainWindow&); MainWindow& operator= (const MainWindow&); bool construct(); bool initMenuBar(); bool initFileMenu(QMenuBar* mb); bool makeAction(QAction*& action, QString text, int key); public: static MainWindow* NewInstance(); //二次构造 ~MainWindow(); }; #endif // MAINWINDOW_H
#include "MainWindow.h" #include "ui_MainWindow.h" #include <QMenu> MainWindow::MainWindow() { } //由于主窗口这个包含很多组件,这里采用二次构造,防止构造过程中某个组件没有正常构造出来,把之前构造的组件销毁掉,防止内存泄漏 MainWindow* MainWindow::NewInstance() { MainWindow* ret = new MainWindow(); if( (ret == NULL) || !ret->construct() ) { delete ret; ret = NULL; } return ret; } //主窗口的构造函数 bool MainWindow::construct() { bool ret = true; //初始化菜单栏,菜单栏由下拉菜单组组成 ret = ret && initMenuBar(); return ret; } //初始化菜单栏 bool MainWindow::initMenuBar() { bool ret = true; QMenuBar* mb = menuBar(); //初始化下拉菜单组,下拉菜单组由菜单项组成 ret = ret && initFileMenu(mb); return ret; } //初始化下拉菜单组 bool MainWindow::initFileMenu(QMenuBar* mb) { //定义菜单项 QMenu* menu = new QMenu("File(&F)"); bool ret = (menu != NULL); if( ret ) { QAction* action = NULL; ret = ret && makeAction(action, "New(N)", Qt::CTRL + Qt::Key_N); if( ret ) { menu->addAction(action); // add Action item to Menu } menu->addSeparator(); //传参的方式构造菜单项 ret = ret && makeAction(action, "Exit(X)", Qt::CTRL + Qt::Key_X); if( ret ) { menu->addAction(action); // add Action item to Menu } } if( ret ) { mb->addMenu(menu); // add Menu add to application Menu Bar } 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 ) { //设置菜单项的快捷键 action->setShortcut(QKeySequence(key)); } else { ret = false; } return ret; } MainWindow::~MainWindow() { }
#include "MainWindow.h" #include <QApplication> #include<QMainWindow> 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 a.exec(); }
四. 主窗口中的工具栏
-
概念和意义
应用程序中继承各种功能实现快捷使用的一个区域
工具栏并不是应用程序中必须存在的组件
工具栏中的元素可以是各种窗口组件
工具栏中的元素通常以图标按钮的方式存在
-
和工具栏相关的类组件
-
实验
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QKeySequence> #include <QMenuBar> #include <QAction> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H
#include "MainWindow.h" #include "ui_MainWindow.h" #include <QMenu> #include <QToolBar> #include <QAction> #include <QIcon> #include <QPushButton> #include <QLabel> #include <QLineEdit> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QToolBar* tb = addToolBar("Tool Bar"); QAction* action = new QAction("", NULL); tb->setFloatable(false); tb->setMovable(false); action->setToolTip("Open"); action->setIcon(QIcon(":/img/open.png")); tb->addAction(action); QPushButton* b = new QPushButton("Button"); // QLabel* l = new QLabel("Label"); // QLineEdit* e = new QLineEdit(); tb->addWidget(b); // tb->addWidget(l); // tb->addWidget(e); } MainWindow::~MainWindow() { }
五. 主窗口的状态栏
-
概念和意义
状态栏是应用程序输出简要信息的区域
状态栏一般位于主窗口的最底部
状态栏中的消息类型有:实时消息(例:当前程序状态)、永久消息(例:程序版本号)、进度消息(例:进度条提示)
-
实验
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QKeySequence> #include <QMenuBar> #include <QAction> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H
#include "MainWindow.h" #include "ui_MainWindow.h" #include <QMenu> #include <QToolBar> #include <QAction> #include <QIcon> #include <QPushButton> #include <QLabel> #include <QLineEdit> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QStatusBar* sb = statusBar(); QLabel* l = new QLabel("Label"); QLineEdit* e = new QLineEdit(); QPushButton* b = new QPushButton("Button"); sb->addPermanentWidget(l); sb->addPermanentWidget(e); sb->addPermanentWidget(b); sb->showMessage("Andrea"); } MainWindow::~MainWindow() { }