【问题标题】:Qt moving gui widget to gui threadQt 将 gui 小部件移动到 gui 线程
【发布时间】:2020-05-01 01:01:20
【问题描述】:

所以 Qt 必须让所有 GUI 应用程序都在主 GUI 线程中运行。我有一个启动 QDialog 的非 gui cpp,当我尝试与小部件交互时,我得到QObject::startTimer: Timers cannot be started from another thread。这就是让我发现我需要将小部件移动到主线程的原因。我的问题是如何将no_id_wheel_screen 移动到主线程。

我的非 gui 线程的 cpp

#include "gui_image_node.h"

gui_image_node::gui_image_node()
{

}

bool gui_image_node::init(int argc, char** argv)
{
    m_pThread = new QThread();

    m_no_id_wheel_screen = new no_id_wheel_screen;

    this->moveToThread(m_pThread);

    connect(m_pThread, &QThread::started, this, &gui_image_node::run);

    connect(m_no_id_wheel_screen, &no_id_wheel_screen::ReadyHollander, this, &gui_image_node::HolPub);

    hollander_pub = nh.advertise<std_msgs::String>("/hollander_chat", 1);

    hol_trigger = nh.subscribe("awaiting_hollander", 1, &gui_image_node::Hollander_Screen_trigger_callback, this);

    m_pThread->start();
    return true;
}
//Where I start the widget
void gui_image_node::Hollander_Screen_trigger_callback(const std_msgs::String::ConstPtr& msg)
{
    std::string steve = msg->data; 
    no_id_wheel_screen midscreen;
    midscreen.exec();
}

【问题讨论】:

  • 为什么要在另一个线程中创建对话框?我会以steve 作为参数向主 UI 线程发送一个信号,并在那里打开对话框。
  • 最大的问题是非 gui 线程是我运行 ROS 命令的方式。我将尝试通过主窗口启动小部件。

标签: qt


【解决方案1】:

@Frank Osterfeld 有正确的想法。我刚刚与 MainWindow 建立了另一个连接,然后 MainWindow 执行了我的小部件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多