用一个 Widget 作为一个 Action,很酷!
贴代码:
#ifndef MYMENUWIDGET_H
#define MYMENUWIDGET_H
#include <QObject>
#include <QWidgetAction>
#include <QLineEdit>
#include <QSplitter>
class QLineWdit;
class MyMenuWidget : public QWidgetAction
{
Q_OBJECT
public:
explicit MyMenuWidget(QObject *parent = nullptr);
protected:
// is an virtual function in QWidgetAction(important)
QWidget* createWidget(QWidget *parent);
signals:
void getText(QString str);
public slots:
void sendText();
private:
QLineEdit *m_lineEdit = nullptr;
};
#endif // MYMENUWIDGET_H
#include "mymenuwidget.h"
#include <QLabel>
MyMenuWidget::MyMenuWidget(QObject *parent) : QWidgetAction(parent)
{
m_lineEdit = new QLineEdit;
// when lineEdit pressed,triger the sendText
connect(m_lineEdit,&QLineEdit::returnPressed,
this,&MyMenuWidget::sendText);
}
QWidget* MyMenuWidget::createWidget(QWidget *parent)
{
if(parent->inherits("QMenu")||parent->inherits("QToolBarr"))
{
// Splitter ??? Why!
QSplitter *splitter = new QSplitter(parent);
QLabel *label = new QLabel;
label->setText("LLLLLL");
splitter->addWidget(label);
splitter->addWidget(m_lineEdit);
return splitter;
}
return nullptr;
}
void MyMenuWidget::sendText()
{
// send the text to MainWindow
emit getText(m_lineEdit->text());
m_lineEdit->clear();
}
- 新建一个类,继承 QWidgetAction
- 重写 createWidget 虚函数
- 将控件加入 QSplitter 并返回 splitter
(为啥要返回一个 QSplitter?dont know)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mymenuwidget.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyMenuWidget *action = new MyMenuWidget;
QMenu *menu = ui->menuBar->addMenu("Edit(&E)");
menu->addAction(action);
connect(action,&MyMenuWidget::getText,this,&MainWindow::setText);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setText(QString str)
{
ui->textEdit->setText(str);
}
运行>>
再玩玩~
不错不错,good good!
参考: