方法1 UI界面添加:拖动法——用于QAction类
创建action直接拖动
方法2 代码添加:addWidget()函数法——用于所有的组件
1.工具栏 添加任意部件的方法:
先实例化(申请想要添加部件的内存空间),再用addWidget函数。如下
//工具栏中添加一个按钮(QPushButton)
QPushButton* btn = new QPushButton(this);
ui->mainToolBar->addWidget(btn);
//工具栏中添加一个标签(QLabel)
QLabel* label = new QLabel(this);
ui->mianToolBar->addWidget(label);
2. 菜单 添加任意部件的方法:
用QWidgetAction这个类,重新写QWidgetAction这个类的CreateWidget()这个函数
(1)先写一个自己的类继承于QWidgetAction,往菜单中添加一个标签和一个行编辑器(LineEdit)
头文件 .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;
}
}
(2)主窗口类中调用
a. 在主窗口类中添加头文件
#include "myaction"
b. 在主窗口的构造函数中添加
myaction* my = new myaction;//申请空间
QMenu* myMenu = ui->menuBar->addMenu(tr("测试"));//添加一个顶级菜单项
myMenu ->addWidget(my);// 把部件添加进菜单中