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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值