Qt Creator 自定义菜单栏

自定义菜单栏

先来看下菜单栏是个啥
在这里插入图片描述
对于日常生活中见到的应用程序而言许多都是基于主窗口的,主窗口包括了菜单栏,工具栏,状态栏和中心区域等。


对于Qt来说工具栏上可以添加任意的部件,那菜单栏可以吗,是否也可以使用其他的部件呢,当然是可以的
我们这里要实现的自定义菜单栏是,通过在lineEdit这个部件中插入文本,然后通过回车把他的内容输入到下面中心区域的textEdit部件中
在这里插入图片描述

操作流程:
①定义一个新的C++类使其继承自QWidgetAction,类型信息选择继承自QObject(因为QWidgetAction继承自QAction,而QAction又继承自QObject
并且在其中重新实现createWidget函数创建一个新的部件(用分裂器来装载返回)
这里的新部件就是QLabel+QLineEdit

②设置相应的信号与槽

③在MainWindow类中对构造函数进行代码编辑


看代码:
对应①②
myactionMenu.h

#include<QWidgetAction>
#include<QWidget>
#include<QLineEdit>
class myActionMenu : public QWidgetAction
{
     Q_OBJECT
public:
    myActionMenu(QObject* parent=0);//类型信息选择继承自QObject
protected:
    QWidget* createWidget(QWidget *parent);
signals:
    //新建信号用于再按下回车建时,将行编辑器中的内容发射出去
    void getText(const QString& string);
private slots:
    //新建槽,它用来与行编辑器的按下回车键信号进行关联
    void sendText();
private:
    //定义行编辑器对象的指针
    QLineEdit* lineEdit;
};

myactionMenu.cpp

#include "myactionmenu.h"
#include<QSplitter>
#include<QLabel>
myActionMenu::myActionMenu(QObject*parent):QWidgetAction(parent)
{
    lineEdit=new QLineEdit;
    //关联信号与槽,当焦点处于lineEdit时按下回车,响应sendText槽方法
    connect(lineEdit,SIGNAL(returnPressed()),this,SLOT(sendText()));
}

QWidget *myActionMenu::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;
    }
    return 0;
}

void myActionMenu::sendText()
{
    emit getText(lineEdit->text());//发射信号
    lineEdit->clear();//清空
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    myActionMenu* action=new myActionMenu;
    QMenu* editMenu=ui->menuBar->addMenu("编辑(&E)");
    editMenu->addAction(action);
    //将action的getText()信号和这里的setText槽进行关联
    connect(action,SIGNAL(getText(QString)),this,SLOT(setText(QString)));
}


最终实现效果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值