通过调用QObject::connect
并传递适当的QAction
来连接到QMenu::triggered
或QMenu::hovered
信号非常简单。
但是,我不知道如何使用QMenu::aboutToHide
信号,因为没有操作传递给该信号。
如何使用QMenu::aboutToHide
和QMenu::aboutToShow
信号,或者仅仅是可以被覆盖的虚函数?
答案 0 :(得分:1)
Qt世界中的信号不是函数,请不要调用它们。这些信号通知QObject发生了某些事情,并在必要时发送信息。
在triggered
和hovered
的情况下,由于QAction
中有多个QAction
,因此有必要发送QMenu
,然后开发人员认为必须知道与哪个QAction
进行交互。另一方面,对于aboutToShow
和aboutToHide
,该信号不发送任何内容,因为它要通知的是分别显示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();
}