通过调用QMenu::triggered
或QMenu::hovered
信号并传递适当的QAction
,连接到QObject::connect
信号非常简单。
但是,我不知道如何使用QMenu::aboutToHide
信号,因为没有传递给该信号的操作。
如何使用QMenu::aboutToHide
和QMenu::aboutToShow
信号,或者这些只是可以被覆盖的虚拟函数?
发布于 2018-09-29 22:52:41
Qt世界中的信号不是函数,永远不要调用它们。信号通知QObject发生了什么事情,并在必要时发送信息。
在triggered
和hovered
的情况下,发送QAction
是必要的,因为在QMenu
中有几个QAction
,然后开发人员认为有必要知道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是显示的还是隐藏的?
解决方案是使用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();
}
https://stackoverflow.com/questions/52575175
复制相似问题