试图在 QT 中控制 File-QMenu 操作

Trying to control File-QMenu Actions in QT

我正在尝试控制 QT Creator 中 QMenu 的 C++ 操作。我有一个 window,它有一个标签,用于发布用户从菜单单击到文本的操作,但我想分别控制每个子菜单(其操作)。

"OPEN" 的不同功能,"QUIT" 的不同功能等等

有什么想法吗?

MainWindow.cpp

#include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent)
    {
        setFixedSize(500,300);
        setWindowTitle("Menu Demo");
        mainWidget=new QWidget;
        setCentralWidget(mainWidget);
        mainWidget->setFixedSize(this->width(),this->height());
        mainLayout=new QVBoxLayout;
        mainWidget->setLayout(mainLayout);

        mainLabel=new QLabel;
        mainLayout->addWidget(mainLabel);

         fileMenu= new QMenu("FILE");


         **fileMenu->addAction("SAVE"); //ACTIONS......different function.
         **fileMenu->addAction("SAVE AS");**
         **fileMenu->addAction("QUIT");****

         editMenu= new QMenu("EDIT");

         **editMenu->addAction("COPY");**
         **editMenu->addAction("CUT");**
         **editMenu->addAction("PASTE");**

         menuBar()->addMenu(fileMenu);
         menuBar()->addMenu(editMenu);
         connect(fileMenu,SIGNAL(triggered(QAction*)),this,SLOT(menuSlot(QAction*)));
         connect(editMenu,SIGNAL(triggered(QAction*)),this,SLOT(menuSlot(QAction*)));
    }

    void MainWindow::menuSlot(QAction *action)
    {
        mainLabel->setText("ACTION: "+action->text());
    }

Mainwindow.h

#ifndef MAINWINDOW_H
    #define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
# include <QVBoxLayout>
# include <QHBoxLayout>
# include <QLabel>
# include <QMenu>
# include <QMenuBar>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
private:
    QWidget *mainWidget;
    QVBoxLayout *mainLayout;
    QLabel *mainLabel;
    QMenuBar *menubar;
    QMenu *fileMenu;
    QMenu *editMenu;
public slots:
    void menuSlot(QAction *action);
};

#endif // MAINWINDOW_H

只需在 MainWindow::menuSlot 中测试 action->text() 并执行请求的操作...

void MainWindow::menuSlot (QAction *action)
{
    mainLabel->setText("ACTION: "+action->text());
    if (action->text() == "SAVE") {

        /*
         * Do whatever is required for `SAVE'.
         */
    } else if (action->text() == "SAVE AS") {

        /*
         * Do whatever is required for `SAVE AS'.
         */
    }
}

您只需确保与每个 QAction 关联的文本是唯一的。

或者,您可以为每个操作设置一个插槽...

fileMenu= new QMenu("FILE");
auto *a = fileMenu->addAction("SAVE");
connect(a, SIGNAL(triggered(QAction *)), this, SLOT(save_slot(QAction *)));
a = fileMenu->addAction("SAVE AS");
connect(a, SIGNAL(triggered(QAction *)), this, SLOT(save_as_slot(QAction *)));
a = fileMenu->addAction("QUIT");
connect(a, SIGNAL(triggered(QAction *)), this, SLOT(quit_slot(QAction *)));

附带说明一下,如果您使用的是 Qt5,您应该更喜欢用于信号和插槽的新 connect syntax