如何在仅点击QMenu对象时执行操作?

7
这是GUI的快照。我想通过单击QMenu对象“帮助”来执行简单操作。这个QMenu对象没有子菜单。Perform action when Help menu is clicked 你能告诉我如何在仅单击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...

1
嗯,我猜你的connect()没有成功,能否请你检查一下connect的返回值?如果是false,那么connect就没有起作用。另外,我认为aboutToShow()更适合。http://qt-project.org/doc/qt-5.0/qtwidgets/qmenu.html#aboutToShow - Najzero
2个回答

11
我会尝试做以下事情:
void MainWindow::createActions()
{
    [..]
    connect(ui->menuHelp, SIGNAL(aboutToShow()), this, SLOT(help()));
}

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

1
有一个 bug 在这里,当将鼠标移动到菜单上时,不需要点击,槽自动触发。 - vivi

8

在这种特定情况下,triggered() 信号不起作用。 - cappy0704
@SaiKamat 因为你正在使用 QMenu。请阅读我的答案。我已经测试过它,它是有效的。 - thuga
谢谢你,thuga。我同意你的观点,当我们有QAction时,triggered()函数是有效的。在这种情况下,我很抱歉没有提到没有QAction项。我只是想寻找一种仅适用于QMenu的方法,正如我之前所提到的。 :) - cappy0704
2
@SaiKamat 我知道。我想指出的是,您应该使用QAction而不是QMenu。将QMenu对象用作QAction对象是一种丑陋的hack方式。QMenu是一个菜单小部件,它应该做的就是提供一个菜单。 - thuga
1
这比被接受的答案更整洁。使用QMenu :: aboutToShow()信号后,菜单栏在我单击菜单控件后仍保持选中状态,这会稍微破坏用户体验。这种方法运行更加流畅。 - d11
谢谢,这绝对有效!创建一个新的 QMenuBar 对象后,可以使用 QMainWindow::setMenuBar 将其设置为窗口的菜单栏。 - Param Siddharth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接