c++ - 在 Qt 中动态设置菜单的内容
问题描述
我想创建一个菜单,其内容是动态确定的(通过从网络接收的一些数据)。我将如何在 Qt 中实现这样的菜单?
每当打开菜单时,都应向网络查询要显示的内容。
解决方案
我认为您正在寻找QMenu::aboutToShow
信号。当用户打开菜单时会发出此信号,这是重新填充菜单的最佳时机。
但是,您必须考虑以下事项:
信号是同步发出的,与 UI 的其余部分有关,这意味着一旦插槽处理完成,将显示菜单。因此,您必须在从该功能返回之前填充菜单。
此信号在主线程(处理 GUI 的线程)中发出,因此界面的其余部分将被阻塞,直到完成。如果您的网络连接依赖于事件循环,这一点很重要。您可以使用
QApplication::processEvents
来确保事件被消耗。
基本示例
为了简单起见,以下示例使用计时器而不是网络连接,但说明了我的观点:
在一些初始化函数中(比如构造函数)。假定菜单已经存在(上下文菜单的情况类似):
connect(ui.menuDynamicMenu, &QMenu::aboutToShow, this, &MainWindow::onMenuAboutToShow);
插槽(m_waiting
应该是原子布尔值或类似受保护的标志,如果您想使用多线程处理网络连接):
void MainWindow::onMenuAboutToShow()
{
// Here your _synchronous_ network query
// Probably you'll have to use some kind of barrier
m_waiting = true;
QTimer::singleShot(2000, this, [this]() {
ui.menuDynamicMenu->clear();
ui.menuDynamicMenu->addAction("Some action from network query");
ui.menuDynamicMenu->addAction("Another action from network query");
m_waiting = false;
});
while (m_waiting) {
qApp->processEvents(QEventLoop::WaitForMoreEvents);
}
}
此示例的完整代码可在GitHub中找到。
推荐阅读
- google-cloud-platform - 为什么 Kafka 消费者在节点故障时冻结,而生产者不受影响?
- c# - 有没有办法区分“命令”键(ctrl、大写锁定、向上翻页等)和“文本”键?
- airflow - 不能使用气流 sqlite DB 使用数据分析查询和图表?
- .net - EPPlus 加载 CSV 并将所有单元格格式化为文本
- python - Sqlalchemy 如何结束与数据库的连接以防止死锁
- java - 如何通过 intellij 在 windows 上使用 jdk12 编写并编译为 .jar 的程序在 Linux 中使用 openJDK 运行
- c# - 泛型类的泛型类型的 C# 育儿?对我来说太复杂了,无法对问题形成更合适的问题:|
- splunk - Splunk 查询从两个查询中获取不匹配的 ID
- sql - 如何在 postgresql 中的 datetime 列上连接两个表,并将 datetime 的所有寄存器显示在一个唯一的列中?
- salt-stack - SaltStack 禁用本地 Windows 管理员(如果已启用)