Qt自定义菜单栏

1.自定义菜单栏需继承自QWidgetAction.
2.新建桌面应用程序testQMenuCustom,基类QMainWindow,勾选创建界面文件,其他选项默认。
3.当前项目添加C++类MyAction,继承自QWidgetAction,编辑myaction.h文件

界面文件
在界面文件中加入QTextEdit部件
选中QTextEdit部件,按Ctrl+j,可以使部件部件占满界面

代码:
myaction.h

#ifndef MYACTION_H
#define MYACTION_H
#include 
#include 

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

#include "myaction.h"
#include 
#include 

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;
    }
    return 0;
}

void MyAction::sendText()
{
    emit getText(lineEdit->text());
    lineEdit->clear();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void setText(const QString& str);

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "myaction.h"
#include 
#include 

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;
    }
    return 0;
}

void MyAction::sendText()
{
    emit getText(lineEdit->text());
    lineEdit->clear();
}

代码解读:
代码在mainwindow.cpp的构造函数中
先new一个MyAction类型的指针action
再定义一个菜单menu设置addMenu(“编辑(&E)”)
菜单menu加入动作按钮action
信号槽:当动作按钮action的信号getText触发
则响应setText槽函数

   也就是在mainwindow.cpp的构造函数里new一个myaction后
   在MyAction的构造函数里new了一个QLineEdit
   而在mainwindow.cpp里action被添加到菜单里
   所以new的QLineEdit是在菜单menu里
   接着是信号与槽
   当new的lineEdit的回车信号响应
   那么触发该窗口的sendText信号
   
   也就是当点击界面的编辑菜单会触发createWidget函数
   在MyAction类里重写了createWidget(因为继承QWidgetAction)
   先判断父部件是否继承自菜单或工具栏
   如果是则创建父部件的子部件并放回子部件
   是则new一个分隔符QSplitter* splitter
   再new一个QLabel* label = new QLabel("插入文本:");
   将label和构造函数中new的lineEdit添加到splitter里
   返回部件splitter

Qt自定义菜单栏_第1张图片当点击界面的编辑菜单,弹出MyAction的splitter
在lineEdit里随便输入,比如123456
Qt自定义菜单栏_第2张图片按回车键则信号触发了槽函数sendText
sendText槽函数里发射getText()信号
函数参数是lineEdit里的字符串
lineEdit清除

MyAction的getText()信号触发MainWindow的setText
在MAinWindow的构造函数中

setText(const QString &str)槽函数是将界面的textEdit设置text
就是把lineEdit里的字符串放到这里

掌握的专业术语不够多,多海涵!

你可能感兴趣的:(Qt,qt)