c++ - 如何在控制台 C++ 程序中制作一个简单的非阻塞弹出窗口?

标签 c++ qt gtk wxwidgets

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

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

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

注意事项:

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

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

最佳答案

要使用 Qt 做到这一点,您需要:

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

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

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

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

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

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

关于c++ - 如何在控制台 C++ 程序中制作一个简单的非阻塞弹出窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5108864/

相关文章:

c++ - 将 qmlRegisterType 与 Q_ENUM 和 typedef 枚举一起使用

c++ - 无法将QString转换为Const Char *

QtService 和 QtRemoteObject 如何一起工作

c - 暂时用其他容器替换容器

c++ - 混合 gtk+ 和 c++

c++ - 在什么情况下 sprintf 会优先于 stringstream?

c++ - 如何在 CentOS 7 上通过 clang 构建 libcxx 和 libcxxabi

c# - 如何检查 Gtk.CheckButton 是否被选中?

c++ - 在 C++ 中逐行使用来自 csv 的数据的有效方法

c++ - boost::signals2 的绑定(bind)类成员函数