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