1

我创建了一组监视外部应用程序的监视程序/帮助程序类,并且我希望在进行更改时将它们打印到我的 MainWindow 的 ui 内的日志窗口中。我的想法是在 main 的一个线程中创建这个观察者,但我不确定将它链接到我的 MainWindow 的最佳方法。我知道像下面这样简单地传递它是行不通的,但是由于 Qt 的设计,我不确定执行此操作的正确方法(如果有的话)。一些研究向我表明,将 MainWindow 传递给外部类并不合适,但我不确定更好的方法。

int main(int argc, char *argv[])
{
    try {
        std::string host = "localhost";
        unsigned short port = 8193;
        MainWindow w;
        w.show();

        // Access class for the program that I am watching
        UserInterface ui(host, port);
        // StatePrinter class, which is registered in the UI and will print changes to MainWindow, ideally
        // would I be able to pass something in the StatePrinter constructor to accomplish my goal?
        ui.registerObserver(new StatePrinter(w));
        UiRunner runner(ui);
        boost::thread runnerThread(boost::ref(runner));

        w.show();
        QApplication a(argc, argv);

        runner.cancel();
        runnerThread.join();

        return a.exec();
    } catch(std::exception &ex) {
        // ...
    }
}

我想有可能在 MainWindow 本身中创建这个线程,但我更喜欢将它放在 main.window 中。将我的 StatePrinter 类链接到 MainWindow 的最佳方法是什么?

4

2 回答 2

2

您可以将观察程序类本身设为 QObject,将其推送到线程中,并使其在“注意到”您想要将日志信息作为信号参数记录的更改时发出信号。

然后,您可以将此对象推送到 QThread 中,如下所示:

QThread* thread = new QThread();
ui->moveToThread(thread);

//Create the needed connections

thread->start();

根据您的需要,您可以将信号连接到线程的start()插槽,而不是直接调用它。(阅读本文以了解您的线程需要哪些连接,以便正确启动、停止和清理)。

于 2013-08-02T14:32:22.640 回答
1

你有几个问题:

  1. 在 QApplication 实例之前创建小部件
  2. runnerThread.join 调用将在进入 Qt 事件循环之前阻塞主 Qt 线程 - 所以你的 GUI 将被冻结

您应该实现通知系统以监视 boost 线程的终止。但更好的解决方案是使用 Qt 线程。

  1. 您应该创建一流的 - 带有必要信号的“观察者”。
  2. 然后使用 UI 逻辑和必要的插槽创建第二类
  3. 然后将信号连接到插槽
  4. 利润!

查看有关 QThread 的 Qt 文档 - 有简单的示例。

于 2013-08-02T14:46:52.153 回答