Trying to control File-QMenu Actions in QT

时间:2017-06-15 10:33:25

标签: c++ qt action

iam trying to control an action on C++ of a QMenu in QT Creator. i have a window that has a label posting the action the user clicks from a menu to text but i want to control each sub menu seperately (the action of its).

Different function for "OPEN", different function for "QUIT" etc.

Any ideas?

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

1 个答案:

答案 0 :(得分:0)

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

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信号和插槽。