菜单栏、工具栏、状态栏
主窗口框架(QMainWindow)拥有自己的布局,包括以下组件:
- 菜单栏
菜单栏包含了一个下拉菜单项的列表,这些菜单项通过QAction动作类实现。一个主窗口只能有一个菜单栏。
- 工具栏
工具栏一般用于常用的菜单项,也可以插入其他窗口部件,一个主窗口可以拥有多个工具栏。
- 中心部件
主窗口中心区域可以放入一个窗口部件作为中心部件,是应用程序的主要功能实现区域,一个主窗口只能有一个中心部件。
- dock部件
dock部件又称为停靠部件,或停靠窗口,可停靠在窗口部件的四周,用来设置一些部件来实现一些功能,类似一个工具箱,一个主窗口可拥有多个dock部件。
- 状态栏
状态栏用于显示程序的一些状态信息,在主窗口的最底下,一个主窗口只能拥有一个状态栏。
菜单栏、工具栏、状态栏
代码添加示例。
代码语言:javascript复制 //菜单
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
代码语言:javascript复制#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_H
MyAction.cpp
代码语言:javascript复制#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();
}