В основном я вызываю функцию из другого потока, используя QtConcurrent
,
Работаю как положено, но как только я создаю QInputDialog
в вызываемой функции я получаю исключение утверждения, сообщающее, что мне нужно создать диалог в главном потоке графического интерфейса.
Чтобы быть более конкретным эта строка:
password = QInputDialog::getText( this , tr( "Password" ) , tr( "Enter Password:" ) , QLineEdit::Password , selectedPassword , &ok );
Теперь вопрос заключается в том, как я могу вызвать диалог из нового потока без лишней дополнительной работы.
Вы не можете создавать виджеты вне основного потока. Вы можете испустить сигнал из сетевого потока и создать диалог в основном потоке.
Или сделайте что-то вроде этого (псевдокод):
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;
}