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里的字符串放到这里
掌握的专业术语不够多,多海涵!