【问题标题】:How to perform action on clicking a QMenu object only?如何仅在单击 QMenu 对象时执行操作?
【发布时间】:2014-03-05 12:15:22
【问题描述】:

这是 GUI 的快照。我只想通过单击QMenu 对象帮助来执行简单的操作。这个QMenu 对象没有任何子菜单。

您能否告诉我在仅单击QMenu 时如何执行操作 这是我尝试过的,但我得到了一个空输出。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QSignalMapper>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void createActions();
    QSignalMapper *pSignalMapper;

private slots:
    void help();

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    createActions();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::createActions()
{
    pSignalMapper = new QSignalMapper(this);
    connect(ui->menuHelp, SIGNAL(triggered(QAction*)), this, SLOT(help()));

}

void MainWindow::help()
{
    qDebug()<<"inside help qdialog";
}

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include <ui_mainwindow.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

点击帮助QMenu时的输出,完全没有:

Starting E:\Qt2\modules\guiPrototype2\build-guiPrototype2-Desktop_Qt_5_2_0_MSVC2010_32bit-Debug\debug\guiPrototype2.exe...

【问题讨论】:

标签: qt signals-slots qmenu qaction


【解决方案1】:

我会尝试执行以下操作:

void MainWindow::createActions()
{
    [..]
    connect(ui->menuHelp, SIGNAL(aboutToShow()), this, SLOT(help()));
}

void MainWindow::help()
{
    qDebug()<<"inside help qdialog";
}

【讨论】:

  • 这里有一个bug,当鼠标在这个菜单上移动时,不点击,槽会自动触发。
【解决方案2】:

它不起作用的原因是因为您没有触发任何操作。

This signal is emitted when an action in a menu belonging to this menubar is triggered as a result of a mouse click; action is the action that caused the signal to be emitted.

您应该做的是向您的QMenuBar 添加一个操作,而不是QMenu

QAction *helpAction = ui->menuBar->addAction("Help");
connect(helpAction, SIGNAL(triggered()), this, SLOT(help()));

【讨论】:

  • triggered() SIGNAL 在这种特定情况下不起作用。
  • @SaiKamat 因为您使用的是QMenu。阅读我的答案。我已经测试过了。
  • 谢谢你,thuga。我同意你的观点,当我们有 QAction 时,trigger() 可以工作。在这种情况下,我很抱歉我没有提到没有 QAction 项目。如前所述,我正在寻找一种仅使用 QMenu 的方法。 :)
  • @SaiKamat 我知道。我试图指出你应该使用QAction 而不是QMenu。像 QAction 对象一样使用 QMenu 对象是一种丑陋的 hacky 做事方式。 QMenu 是一个菜单小部件,这就是它应该做的。提供菜单。
  • 这比公认的答案更简洁。使用 QMenu::aboutToShow() 信号,在我单击菜单控件后菜单栏保持选中状态,这有点破坏用户体验。这种方法更流畅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-15
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多