显示错误消息框时出错。如何显示?

时间:2018-12-27 11:14:36

标签: c++ qt

我尝试显示错误消息框,但是发生了错误。谁能帮忙检查我的编码?

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 :(得分:1)

问题似乎是您的{"credentials":{"display_name":"win10Test","is_default":"","password":"","username":""}, "defaultschedule":true,"host_info":{"ip":"*.*.*.*"}, "install_agent":false,"is_auth_enabled":false,"is_enabled":true,"is_encrypted":false, "is_synchable":false,"name":"win10","os_type":"Windows","priority":300,"use_ssl":false} 正在另一个线程中执行。一个相当简单的Qt解决方案是不要尝试显示smtp_listener中的错误。而是给您的smtp_listener一个错误信号。将此信号连接到表格中的插槽,该插槽可显示错误。 Qt的信号系统会将信号排队,以便在gui线程中执行。

答案 1 :(得分:0)

内部类方法内部的错误处理不是一个好习惯。

如果您的类smtp_listener是从QObject扩展的,那么@Eelke解决方案很好。但是,如果您拥有“清除”类(例如,没有任何Qt关系,例如来自外部库),则应该引发异常返回错误值(或对象)代表错误状态)。

该方法使您可以在一个地方(您的情况下为GUI类)组织错误处理。对于您和其他读取您的代码的程序员来说,这是一个很好的优势。

通过这样的代码,您可以将@Eelke's answer与我的代码结合起来:

函数返回错误:

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";
    }
}

答案 2 :(得分:0)

小部件必须在主线程中创建。我认为您可以通过信号/插槽或事件将任何消息传递到主线程。