(1) 工具栏中添加任意部件的方法:
工具栏中添加任意部件的方法比较简单,基本上就是使用addWidget这个函数来实现
比如:工具栏中添加一个按钮(QPushButton)
QPushButton* btn = new QPushButton(this);
ui->mainToolBar->addWidget(btn);
工具栏中添加一个标签(QLabel)
QLabel* label = new QLabel(this);
ui->mianToolBar->addWidget(label);
总之,就是先申请想要添加部件的内存空间,然后再使用addWidget函数就行
(2) 在菜单中添加任意部件就比较麻烦,
实现这个效果需要使用QWidgetAction这个类,准确的说就是我们需要重新写QWidgetAction这个类中的
CreateWidget()这个函数,因此我们需要重新写一个自己的类继承于QWidgetAction,实现代码如下
头文件 .h
#ifndef MYACTION_H
#define MYACTION_H
#include <QWidgetAction>
#include <QLineEdit>
class myaction : public QWidgetAction
{
Q_OBJECT
public:
explicit myaction(QWidget *parent = 0);
protected:
//重新写了这个函数,在这个函数里面我们可以往菜单里面添加任意部件
QWidget* createWidget(QWidget *parent);
signals:
//信号,回车时发射这个信号,把文本发射出去
void getText(const QString& string);
private slots:
//槽函数,用于和行编辑器的按下回车信号关联
void sendText();
private:
QLineEdit* lineEdit;
};
#endif // MYACTION_H
#include "myaction.h"
#include <QLabel>
#include <QSplitter>
myaction::myaction(QWidget *parent) : QWidgetAction(parent)
{
lineEdit = new QLineEdit; //申请行编辑器的空间
//当在行编辑器中按下回车时进入sendText()这个槽函数
connect(lineEdit,SIGNAL(returnPressed()),
this,SLOT(sendText()));
}
void myaction::sendText()
{
//发射getText()信号
emit getText(lineEdit->text());
lineEdit->clear();
}
QWidget* myaction::createWidget(QWidget *parent)
{
//这里我们使用inherits这个函数来判断父部件是不是菜单或者工具栏,如果不是则返回0
if(parent->inherits("QMenu")||parent->inherits("QToolBar"))
{
QSplitter* splitter = new QSplitter(parent);
//标签申请空间
QLabel* label = new QLabel;
label->setText("插入文本");
splitter->addWidget(label);
splitter->addWidget(lineEdit);
return splitter;
}
}
这个类就完成了,这个类的主要功能是可以往菜单中添加一个标签和一个行编辑器(LineEdit)
接下来就是在主窗口类中调用
首先要在主窗口类中添加头文件
#include "myaction"
然后在主窗口的构造函数中添加
//申请空间
myaction* my = new myaction;
//添加一个顶级菜单项
QMenu* myMenu = ui->menuBar->addMenu(tr("测试"));
// 把部件添加进菜单中
myMenu ->addWidget(my);
————————————————
版权声明:本文为CSDN博主「雨东风帘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38004206/article/details/82290541