Ошибка при отображении окна сообщения об ошибке.Как я могу отобразить это? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь отобразить окно сообщения об ошибке, но произошла ошибка.Кто-нибудь может помочь проверить мою кодировку?

void smtp_listener::pop3Stat(QString reply)
{

    print_D(FUNC);
    if(reply.contains("+OK"))
    {
        *t << "stat" <<"\r\n";
        t->flush();

        setState(POP3_Read);
    }
    else
    {
        print_E("ERROR :"+reply,FUNC,__LINE__);
        QMessageBox msgBox;
        msgBox.setWindowTitle("Error");
        msgBox.setText("Please check it.");
        msgBox.exec();
        quitConn();
        setState(POP3_Quit);
    }
}

Произошла ошибка, как показано ниже:

Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel\qwidget.cpp, line 1118

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Обработка ошибок внутри внутренних методов класса не является хорошей практикой.

Решение @ Eelke хорошо, если ваш класс smtp_listener выходит за пределы QObject.Но если у вас есть «чистый» класс (без каких-либо отношений Qt, например, из внешней библиотеки), вы должны выдать исключение или , вернуть значение ошибки (или объект, представляющийсостояние ошибки).

Этот подход дает вам возможность организовать обработку ошибок в одном месте (класс GUI в вашем случае).Это хорошее преимущество как для вас, так и для других программистов, которые читают ваш код.

Кстати, вы можете объединить @ ответ Eelke с моим, используя такой код:

функция, возвращающая ошибку:

int smtp_listener::pop3Stat(QString reply)
{
    if(reply.contains("+OK"))
    {
        *t << "stat" <<"\r\n";
        t->flush();

        setState(POP3_Read);
        return 0;  // success
    }

    return 1;      // return not null value with error
}

Код для обработки ошибки:

/// slot to handle an error
/// don't forget to connect errorSignal with it
void MainWidnow::errorSignalSlot(int status)
{
    QMessageBox::critical(this, "Error", "Error code: " + QString::number(status));
}

void MainWidnow::button_onClick()
{
    int status = listener.pop3Stat(reply);

    if (status != 0) // not null value means error
    {
        emit(errorSignal(status)); // emit the signal with error code
    }
    else
    {
        qDebug() << "success";
    }
}
0 голосов
/ 27 декабря 2018

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

0 голосов
/ 27 декабря 2018

Кажется, проблема в том, что ваш smtp_listener выполняется в другом потоке.Довольно простым решением Qt было бы не пытаться отображать ошибку от smtp_listener.Вместо этого подайте smtp_listener сигнал об ошибке.Подключите этот сигнал к слоту в вашей форме, который заботится о отображении ошибки.Система сигналов Qt поставит в очередь сигнал для выполнения в потоке графического интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...