c++ - 从 QThread 中运行的 C 代码显示 QMessageBox

标签 c++ c multithreading qt

我有创建 QThread 的主 (GUI) 线程。

在QThread 中,我正在调用一个需要显示QMessageBox 的C 函数。到目前为止,我只是使用了:

void notify(char *str)
{
  QMessageBox::information(0, "", QString(str));
}

在 C++ 代码中,并从 C 代码中调用它。这在没有线程的情况下工作正常,但现在有了线程我遇到了错误,因为不能从另一个线程调用 GUI 函数。

通常,这可以通过使用像 this question 的答案这样的信号来规避。建议;但是,我怀疑我能否从 C 代码中做到这一点。

那么,我怎样才能使 C 代码与 GUI 线程通信并告诉它显示 QMessageBox?

谢谢。

附言

如果可能的话,我想在不触及 C 代码的情况下执行此操作(截至目前,C 代码的 header 中只有一个 extern void notify(char *) 声明,如果可能我希望它停留在那个位置。

最佳答案

假设您的 GUI 有一个 QWidgetQMainWindow 派生类,您可以向其中添加以下内容:

class MyWidget : public QWidget
{
    Q_OBJECT;
public:    
    MyWidget()
    {
        connect(this, SIGNAL(notify_sig(QString)),
                this, SLOT(notify_slot(QString)),
                Qt::QueuedConnection);
    }

    void notify(QString str)
    {
        emit notify_sig(str);
    }

    signals:
        void notify_sig(QString str);

    slots:
        void notify_slot(QString str)
        {
            QMessageBox::information(0, "", str);
        }
};

这里有一个公共(public)函数 notify(),它是小部件类的成员。调用 MyWidget::notify() 会导致信号通过排队的连接发送给自身(这会导致在 GUI 线程中调用插槽)。现在 C notify() 调用只需要调用小部件/窗口的 notify() 函数。这可能很棘手,因为您实际上并没有指向 C notify() 函数中可用的小部件的指针。

通常,C 接口(interface)将允许用户传递一个void* 值,然后通过通知调用返回该值。这将允许您在调用 C 函数时传入指向 MyWidget 的指针,然后在 notify() 中将其强制转换回 MyWidget实现。

MyWidget* wid = ...;
C_function(arg1, ..., wid);

//...

void notify(char* str, void* userdata)
{
    MyWidget* wid = static_cast<MyWidget*>(userdata);
    wid->notify(QString(str));
}

如果您不能更改 C 接口(interface),您可能需要使用某种全局方法来获取小部件/窗口的指针。

请注意,我尚未测试任何此代码,可能有更简单的方法来执行此操作。

关于c++ - 从 QThread 中运行的 C 代码显示 QMessageBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4589299/

相关文章:

c - c中的变量按位运算

在 JNI 中将 jchararray 转换为 jstring

c# - Android & Unity3D - 函数调用转到错误的线程

c# - 线程池 - 可能的线程执行顺序问题

c++ - 服务器端事件 C++ 实现?

c++ - 使用文本文件 c++ 中的名称创建变量或对象

c++ - 使用 set_difference 时出现编译错误

c - 我正在尝试打印 txt 文件,但它在 C 作业中不起作用

python - Scrapy mysql 管道 runInteraction() 中的关键部分

C++ 整数到指针的转换