试图在 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。
我正在尝试控制 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。