老规矩,首先还是建立一个Gui的应用,建立好后在主界面中添加一个TextEdit控件,窗口布局如下图所示:
建立好后添加新文件,模板选择C++类,类名取为MyAction,基类为QWidgetAction,类型信息选择继承自QObject,因为QWidgetAction类继承QAction类,而QAction又继承QObject类,所以这里选择该项。具体看下面源码:
myaction.h
#ifndef MYACTION_H
#define MYACTION_H
#include <QWidgetAction>
#include <QLineEdit>
class QLinkeList; //前置声明
class MyAction : public QWidgetAction
{
Q_OBJECT
public:
explicit MyAction(QObject *parent = 0);
protected:
//声明函数,该函数是QWidgetAction类中的虚函数
QWidget * createWidget(QWidget * parent);
signals:
//新建信号,用于在按下回车键时,将行编辑器中的内容发射出去
void getText(const QString &string);
private slots:
//新建槽,用来与行编辑器的按下回车键信号关联
void sendText();
private:
//定义行编辑器对象的指针
QLineEdit *LineEdit;
};
#endif // MYACTION_H
myaction.cpp
#include "myaction.h"
#include <QSplitter>
#include <QLabel>
MyAction::MyAction(QObject *parent) :
QWidgetAction(parent)
{
LineEdit = new QLineEdit;
//将行编辑器的回车键消息与我们发送文本槽函数关联
connect(LineEdit,SIGNAL(returnPressed()),this,SLOT(sendText()));
}
QWidget *MyAction::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 MyAction::sendText()
{
emit getText(LineEdit->text());//发射信号,将行编辑器中的内容发射出去
LineEdit->clear(); //清空行编辑器中的内容
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QString>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void setText(const QString &string);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "myaction.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyAction *action = new MyAction;
QMenu *editMenu = ui->menuBar->addMenu("编辑");
editMenu->addAction(action);
//将action的getText()信号和这里的setText()槽进行关联
connect(action,SIGNAL(getText(QString)),this,SLOT(setText(QString)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setText(const QString &string)
{
ui->textEdit->setText(string); //将获取的文本添加到编辑器中
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
程序写到这应该已经差不多了,希望各位能够OK啦,具体部分是干啥的都写有注释!
下面是该程序的运行结果
好了,该午休了,下午是我喜欢的课程,等保证精力充沛!