Есть окно MyMainWindow, производное от QMainWindow.
C++ (Qt)
class MyMainWindow: public QMainWindow
{
Q_OBJECT
public slots:
void sltGet(QString str);
};
У окна есть слот, вида
C++ (Qt)
void MyMainWindow::sltGet(QString str){
QMessageBox::information(window(), tr("title"), str);
}
Есть второй поток, в который передается указатель на существующий экземпляр окна. Как в этом потоке выполнить вызов слота.
C++ (Qt)
void func(MyMainWindow* pWindow)
{
pWindow->sltGet("Hello World");
}
Такой вариант не подходит, так как отрисовка окон происходит в GUI потоке, о чем свидетельствует екцепшин с красным крестиком в верхнем левом угле.
"Widgets must be created in GUI thread"
---------------------------------------------Сейчас пошел по второму варианту: объявил дополнительный сигнал и метод приема
C++ (Qt)
class MyMainWindow: public QMainWindow
{
Q_OBJECT
public:
void get(QString str);
public slots:
void sltGet(QString str);
signals:
void signGet(QString str);
};
MyMainWindow::MyMainWindow()
{
...
connect(this, SIGNAL(signGet(QString)), this, SLOT(sltGet(QString)));
...
}
void MyMainWindow::get(QString str){
emit sltGet(str);
}
void MyMainWindow::sltGet(QString str){
QMessageBox::information(window(), tr("title"), str);
}
void func(MyMainWindow* pWindow)
{
pWindow->get("Hello World");
}
Собственно, хочется более элегантного решения чем я описал в последнем случае, а то много вторичного кода получается. Хочется, зная указатель на QT-объект, передать в GUI-поток, о том что был emit (вызов).