[英]Error when display an error message box. How can i display it?
我尝试显示一个错误消息框,但是发生了错误。 谁能帮忙检查我的编码?
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
问题似乎是您的smtp_listener
正在另一个线程中执行。 一个相当简单的Qt解决方案是不尝试显示smtp_listener
的错误。 而是给您的smtp_listener
一个错误信号。 将此信号连接到表格中的插槽,该插槽可显示错误。 Qt的信号系统会将信号排队,以便在gui线程中执行。
内部类方法内部的错误处理不是一个好习惯。
如果您的类smtp_listener
从QObject扩展的,则@Eelke解决方案很好。 但是,如果您具有“清除”类(例如,没有任何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";
}
}
小部件必须在主线程中创建。 我认为您可以通过信号/插槽或事件将任何消息传递到主线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.