Предполагая, что у вас есть производный класс QWidget
или QMainWindow
для вашего GUI, вы можете добавить к нему следующее:
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);
}
};
Здесь у вас есть открытая функция notify()
, которая является членом класса виджетов. Вызов MyWidget::notify()
приводит к отправке сигнала себе через соединение с очередями (что приведет к вызову слота в потоке GUI). Теперь вызову C notify()
просто нужно вызвать функцию notify()
виджета / окна. Это может быть сложно, поскольку у вас нет указателя на виджет, доступный в функции C notify()
.
Обычно интерфейс C позволяет пользователю передавать значение void*
и затем возвращает это значение с помощью вызова notify. Это позволит вам передать указатель на MyWidget
при вызове функции C и затем привести его обратно к MyWidget
в реализации notify()
.
MyWidget* wid = ...;
C_function(arg1, ..., wid);
//...
void notify(char* str, void* userdata)
{
MyWidget* wid = static_cast<MyWidget*>(userdata);
wid->notify(QString(str));
}
Если вы не можете изменить интерфейс C, вам может понадобиться какой-то глобальный способ получения указателя на виджет / окно.
Обратите внимание, что я не тестировал ни один из этого кода, и может быть более простой способ сделать это.