簡體   English   中英

如何使用QMenu信號?

[英]How to use QMenu signals?

通過調用QObject::connect並傳遞適當的QAction ,連接到QMenu::triggeredQMenu::hovered信號非常簡單。

但是,我不知道如何使用QMenu::aboutToHide信號,因為沒有操作傳遞給該信號。

如何使用QMenu::aboutToHideQMenu::aboutToShow信號,或者只是可以被覆蓋的虛函數?

Qt世界中的信號不是函數,永遠不要調用它們。 這些信號通知QObject發生了某些事情,並在必要時發送信息。

triggeredhovered的情況下,有必要發送QAction因為QMenu中有多個QAction ,那么開發人員認為有必要知道與哪個QAction進行交互。 另一方面, aboutToShow aboutToHideaboutToHide信號不會發送任何內容,因為它想通知的是分別顯示了QMenu還是隱藏了QMenu 是否需要知道QMenu已顯示或隱藏? 不,因為發件人已經這樣做了,所以我不使用我們手頭上沒有的其他屬性。

使用示例:

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    QMenu *foo_menu = w.menuBar()->addMenu("Foo Menu");
    for(const QString & name: {"action1", "action2", "action3"}){
        foo_menu->addAction(name);
    }
    QObject::connect(foo_menu, &QMenu::aboutToShow, [](){
        qDebug()<<"aboutToShow";
    });
    QObject::connect(foo_menu, &QMenu::aboutToHide, [](){
        qDebug()<<"aboutToHide";
    });
    QObject::connect(foo_menu, &QMenu::triggered, [](QAction *action){
        qDebug()<< "triggered: " <<action->text();
    });
    QObject::connect(foo_menu, &QMenu::hovered, [](QAction *action){
        qDebug()<< "hovered: " <<action->text();
    });
    w.show();

    return a.exec();
}

如果有多個QMenu連接到同一插槽,會發生什么情況? 我怎么知道QMenu是顯示還是隱藏?

解決方案是使用sender() ,它是屬於QObject類的方法,該方法返回發出信號的對象,在本例中為QMenu

例:

#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QDebug>

class MainWindow: public QMainWindow{
public:
    MainWindow(QWidget *parent=nullptr):
        QMainWindow(parent)
    {
        for(const QString & name_of_menubar: {"bar1", "bar2", "bar3"}){
            QMenu *menu = menuBar()->addMenu(name_of_menubar);
            connect(menu, &QMenu::aboutToShow, this, &MainWindow::on_aboutToShow);
            connect(menu, &QMenu::aboutToHide, this, &MainWindow::on_aboutToHide);
            for(const QString & name: {"action1", "action2", "action3"}){
                menu->addAction(name);
            }
        }
    }
private slots:
    void on_aboutToShow(){
        if(QMenu *menu = qobject_cast<QMenu *>(sender()))
            qDebug()<<"aboutToShow" << menu->title();
    }
    void on_aboutToHide(){
        if(QMenu *menu = qobject_cast<QMenu *>(sender()))
            qDebug()<<"aboutToHide" << menu->title();
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM