Как создать QInputDialog в новом потоке?

В основном я вызываю функцию из другого потока, используя QtConcurrent,

Работаю как положено, но как только я создаю QInputDialog в вызываемой функции я получаю исключение утверждения, сообщающее, что мне нужно создать диалог в главном потоке графического интерфейса.

Чтобы быть более конкретным эта строка:

password = QInputDialog::getText( this , tr( "Password" ) , tr( "Enter Password:" ) , QLineEdit::Password , selectedPassword , &ok );

Теперь вопрос заключается в том, как я могу вызвать диалог из нового потока без лишней дополнительной работы.

0

Решение

Вы не можете создавать виджеты вне основного потока. Вы можете испустить сигнал из сетевого потока и создать диалог в основном потоке.

Или сделайте что-то вроде этого (псевдокод):

class NotificationManager : public QObject
{
Q_OBJECT
//...
public slots:
void showMessage( const QString& text )
{
if ( QThread::currendThread() != this->thread() )
{
QMetaObject::invoke( this, "showMessage", Qt::QueuedConnection, Q_ARG( QString, text );
// Or use Qt::BlockingQueuedConnection to freeze caller thread, until dialog will be closed
return;
}
QMessageBox::information( nullptr, QString(), text );
}
};

class ThreadedWorker : public QRunnable
{
ThreadedWorker( NotificationManager *notifications )
: _notifications( notifications )
{}

void run() override
{
// Do some work;
notifications->showMessage( "Show this in GUI thread" );
}

private:
NotificationManager *_notifications;
}
1

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


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