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

时间:2011-02-24 18:29:05

标签: c++ qt gtk wxwidgets

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

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

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

注意:

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

我会非常感谢有效的代码,但这并不是必须有用的。

1 个答案:

答案 0 :(得分:1)

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

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

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

  • 删除对话框对象
  • 呼叫 的QApplication ::实例() - >退出();
  • 删除QApplication对象。
  • 结束主题。

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

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

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