Как выполнить действие только при нажатии на объект QMenu?

Вот снимок графического интерфейса. Я хочу выполнять простые действия исключительно нажатием на 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...

person cappy0704    schedule 05.03.2014    source источник
comment
хорошо, я предполагаю, что ваш connect() не удался, не могли бы вы проверить возвращаемое значение connect? если оно ложно, то соединение не сработало. Кроме того, я думаю, что aboutThoShow() лучше подходит для qt- project.org/doc/qt-5.0/qtwidgets/qmenu.html#aboutToShow   -  person Najzero    schedule 05.03.2014


Ответы (2)


Я бы попробовал сделать следующее:

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

void MainWindow::help()
{
    qDebug()<<"inside help qdialog";
}
person vahancho    schedule 05.03.2014
comment
при этом здесь есть баг, при перемещении мышки по этому меню, без щелчка, слот срабатывает автоматически. - person vivi; 30.09.2019

Причина, по которой это не работает, заключается в том, что вы не запускаете никаких действий.

Этот сигнал выдается, когда действие в меню, принадлежащем эта строка меню запускается в результате щелчка мыши; action – это действие, вызвавшее отправку сигнала.

Что вам нужно сделать, так это добавить действие к вашему QMenuBar вместо QMenu.

QAction *helpAction = ui->menuBar->addAction("Help");
connect(helpAction, SIGNAL(triggered()), this, SLOT(help()));
person thuga    schedule 05.03.2014
comment
triggered() SIGNAL не работает в этом конкретном случае. - person cappy0704; 05.03.2014
comment
@SaiKamat Потому что вы используете QMenu. Прочитай мой ответ. Он работает, как я проверял. - person thuga; 05.03.2014
comment
спасибо, туга. я согласен с вами, triggered() работает, когда у нас есть QAction. В этом случае я извиняюсь за то, что не упомянул, что нет элементов QAction. Как уже упоминалось, я искал способ работать только с QMenu. :) - person cappy0704; 05.03.2014
comment
@SaiKamat Я знаю. Я пытался указать, что вы должны использовать QAction вместо QMenu. Использование объекта QMenu как объекта QAction — это уродливый хакерский способ ведения дел. QMenu — это виджет меню, и именно это он и должен делать. Предоставьте меню. - person thuga; 05.03.2014
comment
Это лучше, чем принятый ответ. С сигналом QMenu::aboutToShow() строка меню остается выделенной после того, как я щелкнул элемент управления меню, что немного портит работу пользователя. Этот метод работает более плавно. - person d11; 13.10.2016
comment
Спасибо, это определенно работает! После создания нового объекта QMenuBar можно использовать QMainWindow::setMenuBar, чтобы установить его в качестве строки меню окна. - person Param Siddharth; 15.08.2020