如何使用QMenu信号?



通过调用QObject::connect连接到QMenu::triggeredQMenu::hovered信号并通过适当的QAction非常简单。

但是,我不知道如何使用QMenu::aboutToHide信号,因为没有传递给该信号的操作。

如何使用QMenu::aboutToHideQMenu::aboutToShow信号,或者这些只是可以覆盖的虚拟功能?

Qt世界中的信号不是函数,永远不要调用它们。信号通知QObject发生了一些事情,并在必要时发送信息。

triggeredhovered的情况下,有必要发送QAction,因为一个QMenu中有几个QAction,然后开发人员认为有必要知道QAction正在与哪个交互。另一方面,对于aboutToShowaboutToHide,信号不会发送任何东西,因为它要通知的是,如果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();
}

相关内容

  • 没有找到相关文章

最新更新