QT 中菜单栏或者工具栏中添加任意部件

(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 
#include 
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 
#include 
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);

 

你可能感兴趣的:(QT 中菜单栏或者工具栏中添加任意部件)