[英]How to use QMenu signals?
通過調用QObject::connect
並傳遞適當的QAction
,連接到QMenu::triggered
或QMenu::hovered
信號非常簡單。
但是,我不知道如何使用QMenu::aboutToHide
信號,因為沒有操作傳遞給該信號。
如何使用QMenu::aboutToHide
和QMenu::aboutToShow
信號,或者只是可以被覆蓋的虛函數?
Qt世界中的信號不是函數,永遠不要調用它們。 這些信號通知QObject發生了某些事情,並在必要時發送信息。
在triggered
和hovered
的情況下,有必要發送QAction
因為QMenu
中有多個QAction
,那么開發人員認為有必要知道與哪個QAction
進行交互。 另一方面, aboutToShow
aboutToHide
和aboutToHide
信號不會發送任何內容,因為它想通知的是分別顯示了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.