【QT】QT菜单栏、状态栏、工具栏

2023-05-13 13:52:20 浏览数 (2)

菜单栏、工具栏、状态栏

主窗口框架(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();
}

0 人点赞