我以标准方式创建上下文菜单:
QMenu contextMenu(tr("Context menu"), this);
QAction action1(tr("Копировать"), this);
QAction action2(tr("Выделить все"), this);
contextMenu.addAction(&action1);
contextMenu.addAction(&action2);
contextMenu.exec(mapToGlobal(pos));
但是弹出的窗口原来是模态的——它会阻塞流程,直到我选择某些东西或取消菜单的打开,例如,使用按钮Esc。
我使用 QEventLoop,它允许我在一个线程中处理用户事件并执行一些其他简单的操作——处理文件、简单的重复计算。
试图强制菜单是非模态的:
contextMenu.setWindowModality(Qt::WindowModality::NonModal);
但之后的菜单停止出现。我也尝试使用
contextMenu.show();
и
contextMenu.popup(mapToGlobal(pos));
但这也无济于事。
有谁知道如何使上下文菜单成为非模态菜单,或者为什么contextMenu.setWindowModality(Qt::WindowModality::NonModal);菜单在强制安装后停止出现?
QEventLoop我用的是PavelK的方法,没有问题。
exec()Qt 中的方法以相同的方式工作。他们在自己内部创建QEventLoop并等待它的插槽在特定条件下被调用quit()。这个想法类似于我在您的链接中看到的那个。同时,本地的
QEventLoop将所有事件传送到它们的目的地。为什么
exec()它会阻止您的方法的执行?不幸的是,没有看到你的代码,我只能猜测,但你可能正在等待你的方法退出你的
QEventLoop,而它被 中断QEventLoop,这在exec(). 因此,直到方法QEventLoop退出时才会退出。QEventLoopexec()因此,菜单的模态与它无关。此外,QMenu 是默认的
NonModal,这意味着调用contextMenu.setWindowModality(Qt::WindowModality::NonModal);不应该改变程序的工作方式。要解决此问题,您应该尽可能使用常规事件和信号/插槽。本地人
QEventLoop甚至会在运行时交付它们QMenu::exec()。该应用程序也有自己的QEventLoop,它将在调用 app.exec() 时启动,并将负责在其余时间传递事件。为什么它不起作用
QMenu::popup?该调用
popup是“异步的”(准确地说,它只会在应用程序开始处理事件时产生可见的效果)。调用之后,程序继续执行,对象QMenu超出作用域就被销毁,你甚至没有时间去看它。您可以使用new查看答案来解决此问题。.show()根本不应该用于QMenu.这是它工作正常的方式:
它是如何为我工作的:
...
static不适合我,因为 我正在使用多个表。因此,有必要取出一个班级的所有成员。