菜单栏、工具栏、状态栏
主窗口框架(QMainWindow)拥有自己的布局,包括以下组件:
菜单栏包含了一个下拉菜单项的列表,这些菜单项通过QAction动作类实现。一个主窗口只能有一个菜单栏。
工具栏一般用于常用的菜单项,也可以插入其他窗口部件,一个主窗口可以拥有多个工具栏。
主窗口中心区域可以放入一个窗口部件作为中心部件,是应用程序的主要功能实现区域,一个主窗口只能有一个中心部件。
dock部件又称为停靠部件,或停靠窗口,可停靠在窗口部件的四周,用来设置一些部件来实现一些功能,类似一个工具箱,一个主窗口可拥有多个dock部件。
状态栏用于显示程序的一些状态信息,在主窗口的最底下,一个主窗口只能拥有一个状态栏。
菜单栏、工具栏、状态栏
代码添加示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| QMenu* editMenu = ui->menuBar->addMenu("编辑(&E)"); QAction *action_copy = editMenu->addAction(QIcon("test.png"),QString("复制(&C)")); action_copy->setShortcut(QKeySequence("Ctrl+C")); ui->mainToolBar->addAction(action_copy); QActionGroup* group = new QActionGroup(this); QAction* action_L = group->addAction("左对齐(&L)"); QAction* action_R = group->addAction("右对齐(&R)"); QAction* action_C = group->addAction("居中对齐(&C)"); QAction* action_J = group->addAction("两端对齐(&J)"); action_L->setCheckable(true); action_R->setCheckable(true); action_C->setCheckable(true); action_J->setCheckable(true); editMenu->addSeparator(); editMenu->addAction(action_L); editMenu->addAction(action_R); editMenu->addAction(action_C); editMenu->addAction(action_J);
QToolButton* toolBtn = new QToolButton(this); toolBtn->setText("颜色"); QMenu* colorMenu = new QMenu(this); colorMenu->addAction("红色"); colorMenu->addAction("绿色"); toolBtn->setMenu(colorMenu); toolBtn->setPopupMode(QToolButton::MenuButtonPopup); ui->mainToolBar->addWidget(toolBtn); QSpinBox* spinBox = new QSpinBox(this); ui->mainToolBar->addWidget(spinBox); ui->statusBar->showMessage(QString("欢迎......"),3000); QLabel* tag = new QLabel("https://doraemon-hub-art.github.io"); ui->statusBar->addPermanentWidget(tag);
|
自定义菜单栏
自定义菜单需要定义一个继承QWidgetAction的类, 并重写createWidget方法,在该方法中自定义部件设置。
示例MyAction.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #ifndef MYACTION_H #define MYACTION_H #include<QWidgetAction> #include<QLineEdit>
class MyAction : public QWidgetAction { Q_OBJECT public: MyAction(QObject* parent = 0); protected: QWidget* createWidget(QWidget* parent); signals: void getText(const QString& string); private slots: void sendText(); private: QLineEdit* lineEdit; };
#endif
|
MyAction.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include "myaction.h" #include<QSplitter> #include<QLabel> MyAction::MyAction(QObject* parent):QWidgetAction(parent) { lineEdit = new QLineEdit; connect(lineEdit,&QLineEdit::returnPressed,this,&MyAction::sendText); }
QWidget *MyAction::createWidget(QWidget *parent) { if(parent->inherits("QMenu")||parent->inherits("QToolBar")) { QSplitter * splitter = new QSplitter(parent); QLabel* label = new QLabel("插入文本:"); splitter->addWidget(label); splitter->addWidget(lineEdit); return splitter; } } void MyAction::sendText() { emit getText(lineEdit->text()); lineEdit->clear(); }
|