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 <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

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

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

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

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

在这里插入图片描述当点击界面的编辑菜单,弹出MyAction的splitter
在lineEdit里随便输入,比如123456
在这里插入图片描述按回车键则信号触发了槽函数sendText
sendText槽函数里发射getText()信号
函数参数是lineEdit里的字符串
lineEdit清除

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

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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值