Как я могу показать MessageBox в другой теме Qt

Вот мой код для этого:

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
testApp w;
w.show();
TestClass *test = new TestClass;
QObject::connect(w.ui.pushButton, SIGNAL(clicked()), test, SLOT(something()));
return a.exec();
}

TestClass.h

class TestClass: public QObject
{
Q_OBJECT
public slots:
void something()
{
TestThread *thread = new TestThread;

thread -> start();
}

};

TestThread.h

class TestThread: public QThread
{
Q_OBJECT
protected:
void run()
{
sleep(1000);
QMessageBox Msgbox;
Msgbox.setText("Hello!");
Msgbox.exec();
}

};

Если я делаю это, я вижу ошибку

виджеты должны быть созданы в потоке графического интерфейса

Что я делаю неправильно? Пожалуйста, помогите мне. Я знаю, что я не могу изменить графический интерфейс в другом потоке, но я не знаю конструкций в qt для этого.

6

Решение

Что ты делаешь не так?

Вы пытаетесь показать виджет в не-графическом потоке.

Как исправить?

class TestClass: public QObject
{
Q_OBJECT
public slots:
void something()
{
TestThread *thread = new TestThread();

// Use Qt::BlockingQueuedConnection !!!
connect( thread, SIGNAL( showMB() ), this, SLOT( showMessageBox() ), Qt::BlockingQueuedConnection ) ;

thread->start();
}
void showMessageBox()
{
QMessageBox Msgbox;
Msgbox.setText("Hello!");
Msgbox.exec();
}
};class TestThread: public QThread
{
Q_OBJECT
signals:
void showMB();
protected:
void run()
{
sleep(1);
emit showMB();
}

};
7

Другие решения


По вопросам рекламы [email protected]