- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Reading the Qt5 source code ,我注意到 QLabel::contextMenuEvent()
使用这种(非阻塞)样式:
QMenu *menu = ...
menu->setAttribute(Qt::WA_DeleteOnClose);
// Non-blocking
menu->popup(event->globalPos());
或者,我从 Qt 代码示例中看到了这种(阻塞)样式:
QMenu *menu = ...
// Blocking
QAction* action = menu->exec(event->globalPos());
// Or before menu->exec() call: menu->setAttribute(Qt::WA_DeleteOnClose)
delete menu;
我可以看到这些差异:
void
与QAction*
他们还有其他区别吗?示例:非阻塞是否有优点,例如,事件循环可以处理其他事件?如果差异纯粹是风格,请告诉我。
最后,我确实注意到在 GNU/Linux/KDE 上调试非阻塞风格对我来说有点奇怪,但这可能是无关的。
最佳答案
When to call QMenu::popup() vs QMenu::exec()?
前者:总是。后者:从来没有。就这么简单。
为什么?因为重新进入事件循环会导致意大利面条式代码。世界是异步的,你不能假装你正在“等待”同步代码中的某些内容,而世界仍在继续,并执行这种代码风格向你隐藏的各种事情。exec()
调用的真正含义是“运行应用程序的任意部分,直到用户决定他们已经受够了弹出窗口的不确定时间”。如果这听起来很糟糕,那么它的意思是:这是开发 UI 代码的令人讨厌的、有缺陷的、糟糕的方式,并且会导致难以调试的错误,并且允许你拖延而不是花时间以异步方式实际完成它。让我感到震惊的是,Qt 项目仍然在其代码示例中提供了这一点。
exec()
是可禁止的。在极少数情况下,由于 Qt 的平台特定代码被破坏而必须使用它。例如。 Qt 没有费心(我上次检查过)从 MacOS 上的主运行循环实现
QDrag
支持,因此他们启动了本地运行循环,只是因为 Apple 的示例代码显示了相同的白痴,而它可以是没有 AFAIK 就完成了(虽然它是 nbot 一样微不足道 - 但那又怎样,它是库代码,它不应该总是微不足道 - 否则用户可以自己做)。
您可以使用状态机 (QStateMachine
) 来指定应用程序的行为,为特定弹出窗口可见时提供专用状态,然后您可以作为应用程序执行必要的响应退出该状态。您还可以使用 C++20 协程编写 Qt ui 代码,并使用一些脚手架代码来实现这一点(Qt 尚未提供任何代码)。
关于qt - 何时调用异步 QMenu::popup() 与同步 QMenu::exec()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63303201/
大家好 我有一些代码根据一些数据生成动态填充的 QMenu(我将其称为 thisMenu)。创建 QMenu thisMenu,将一些“主”QWidget 作为父级,并添加到此 QWidget 中的
我在应用程序中的 MainWindow 之上构建了一个 QMenu MainMenu 。由于每个人都习惯了,我有以下 QMenu 主菜单: File - Edit - SuperHeavyExpert
如果没有其他原因,只是为了我自己的消遣,我想写一个全局插入运算符,这样我就可以使用花哨的代码了: aQMenu addAction(action); return menu; } 编译
Reading the Qt5 source code ,我注意到 QLabel::contextMenuEvent() 使用这种(非阻塞)样式: QMenu *menu = ... menu->se
Reading the Qt5 source code ,我注意到 QLabel::contextMenuEvent() 使用这种(非阻塞)样式: QMenu *menu = ... menu->se
使用 Qt5,假设我有一个实现其自己的上下文菜单的控件。并假设在某些情况下我想将一些项目添加到标准上下文菜单。因此,为此,我创建了一个临时 QMenu,向其中添加一些内容并附加标准菜单。像这样的东西:
代码示例: auto fileMenu = std::make_unique(this->menuBar()->addMenu("First")); fileMenu->addAction("AFir
我正在使用 QT4 并动态地向 QMenu 添加条目。是否可以对 QMenu 中的条目进行排序而不删除它并创建一个新条目? 我原本以为有一个函数可以在特定位置插入,因此我可以在插入时进行排序,但我一直
我使用 Windows,我想将样式表设置为 QMenu 以赋予其半透明背景。为了让它起作用,我首先设置 FramelessWindowHint,然后设置 WA_TranslucentBackgroun
我的情况非常具体。我想将 QAction 放入 QToolbar 并达到以下行为: 可检查带有图标的QAction。 右侧的经典箭头,用于显示菜单 通过按此箭头,我的 QDialog 应该出现在屏幕上
我有一个带有半透明背景和圆角边缘(边框半径)的 QMenu。不幸的是,Windows 7 为该菜单绘制了阴影,该阴影不适合圆角边缘。它是为普通矩形菜单绘制的阴影。 有没有 - 一种完全禁用 QMenu
我希望主窗口中有一个菜单栏,并且能够从其他类设置菜单栏中的菜单。使用 setMenuWidget 命令将覆盖第一个菜单选项,如代码所示。在我设置菜单的类中,我想我可能需要只设置一个菜单而不是菜单栏,然
我正在使用一个执行一些方法的自定义 QMenu。该菜单具有三个选项:删除行选项、切换变量选项和调试选项(打印切换变量的值)。代码未正确执行。有时调试按钮不起作用,它会突然被执行多次。切换选项需要单击两
我正在玩弄提到的 Qt 演示浏览器示例 here并在我尝试对书签处理代码进行微小更改时注意到异常情况。 我的目的是让工具栏中的书签在新选项卡而不是现有选项卡中打开。它非常适合直接位于书签选项卡上的书签
我有几个struct,带有enum和std::string,我用来填充QComboBox使用 for() 循环与他们一起使用。像这样: struct Struct { enum Enum
QMenu 显示在 QLineEdit 右键单击上。问题:如何修改此代码以在单击鼠标左键时也显示菜单? from PyQt4.QtCore import * from PyQt4.QtGui im
是否有信号/事件可用于 QMenu 撕下? 我有一个 QMenu 子类,其中有 .setTearOffEnabled(True),但如果用户点击可撕下的“栏”。 我无法使用 QtCore.Qt.Win
我有一个弹出式 QMenu 在 QListView 中显示很 multimap 标: QMenu*menu=createMenu(); QListView*list=createList(); QWi
我正在尝试构建一个菜单,其中包含一些在 QT 中不可交互的项目。我在我的 MyCustomMenuClass 中继承了 QMenu。我正在尝试将部分标题添加到我的菜单中,以便用户更清楚。 例如,它应该
我想用 QPushButton 和 QMenu 构建一个下拉列表控件,如下所示: QPushButton* menuBt = new QPushButton("Please select"); men
我是一名优秀的程序员,十分优秀!