Qt学习笔记(6)——自定义菜单

老规矩,首先还是建立一个Gui的应用,建立好后在主界面中添加一个TextEdit控件,窗口布局如下图所示:Qt学习笔记(6)——自定义菜单

       建立好后添加新文件,模板选择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啦,具体部分是干啥的都写有注释!

下面是该程序的运行结果

Qt学习笔记(6)——自定义菜单

好了,该午休了,下午是我喜欢的课程,等保证精力充沛!

你可能感兴趣的:(Qt学习笔记(6)——自定义菜单)