Qt Creator 自定义菜单栏

自定义菜单栏

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


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

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

②设置相应的信号与槽

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


看代码:
对应①②
myactionMenu.h

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


最终实现效果:
Qt Creator 自定义菜单栏_第2张图片

你可能感兴趣的:(Qt,qt,c++,类)