自定义菜单栏
先来看下菜单栏是个啥
对于日常生活中见到的应用程序而言许多都是基于主窗口的,主窗口包括了菜单栏,工具栏,状态栏和中心区域等。
对于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)));
}
最终实现效果: