【问题标题】:How to make a simple non-blocking popup window in a console C++ program?如何在控制台 C++ 程序中制作一个简单的非阻塞弹出窗口?
【发布时间】:2011-07-03 19:00:14
【问题描述】:

我试图找出在普通命令行应用程序中最容易实现这样一个有用功能的 C++ GUI 工具包 (+stdlib+libc):

void ShowStringWindow(string& s) {
  // ...
}

ShowStringWindow 应该显示一个带有包含字符串 s 的可编辑框的窗口。
它应该立即返回,以便主线程可以继续。

注意事项:

  • 如果主线程改变了显示的字符串,字符串也应该改变。 (主动检查就好)
  • 如果用户编辑字符串(并按回车确认)字符串 s 应该被更新。
  • 您可以假设主线程在更新时不会读取或写入此字符串。
  • 接下来对 ShowStringWindow 的调用会添加更多类似的窗口(如果实现起来不太困难,则可以向现有窗口添加更多小部件)。
  • 它应该可以在 linux/ubuntu 上运行。

我会非常感谢一个有效的代码,但这不是有用的。

【问题讨论】:

  • 您是在制作控制台应用程序还是 Windows 应用程序?您已经标记了 Qt、wxWidgets 等,但没有提及您在问题中实现的框架是否有这些...
  • @AJG85: 标题和内容都明确写成控制台应用。
  • @Lukasz 对不起,我的意思是强调控制台程序本质上是命令行驱动的或使用基于文本的终端。弹出窗口、无模式对话框、编辑控件、小部件以及您似乎不想要的东西。
  • 您的窗口框架是否允许在另一个线程中创建一个简单的对话框?如果是这样,这似乎是最简单的解决方案。

标签: c++ qt gtk wxwidgets


【解决方案1】:

要使用 Qt 执行此操作,您需要:

  • 为字符串创建互斥锁 变量。
  • 显然是创建一个线程。
  • 创建一个 QApplication 对象,在那个 线。 (第一次通话)
  • 设置“setQuitOnLastWindowsClosed” 在 QApplication 上设置为 false。 (第一次通话)
  • 创建对话框并“执行”它。

“exec”函数返回后,需要:

  • 删除对话框对象
  • 呼叫 QApplication::instance()->quit();
  • 删除 QApplication 对象。
  • 结束话题。

有几种方法可以从主线程更新数据。
一种方法是使用具有排队连接类型的信号/插槽。使用这个,UI 线程更新值。减轻对主线程的影响。但是,请注意,如果值更新率太高,例如每秒 2000 次,您可能需要更改为轮询值。为此,您可能会发现 QTimer 很有帮助。

将数据更新到主线程应该更容易一些,只需锁定互斥体并插入值。此时,您可以检查我们之前从主线程中获取的值是否仍然是主线程中的当前值。你确实声明它不会改变,但我不相信:)

我希望这已经足够了。我们用它为控制台程序创建了一个基于 Qt 的错误对话框。

【讨论】:

  • 我不知道是不是这样,但是如果你尝试在有QApplication之前运行QThread的事件循环,它就行不通了。这是因为除非有 QCoreApplication 的实例(由 QApplication 继承),否则无法创建事件循环。如果是这种情况,您可以通过覆盖 QThread 中的“运行”函数并在那里创建 QApplication 来修复它。这将起作用,因为 QThread 还没有尝试运行它的事件循环。当“运行”返回时,它会。
猜你喜欢
  • 2014-06-23
  • 2021-03-10
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多