QT连接Sqlite卡在QMessageBox::warning
看了下语法没错啊把QMessageBox::warning(this, tr("错误"),tr("数据库连接失败")); 注释掉能通过 怎么回事{:1_908:}
源代码是这样的
#include "stusql.h"
#include<QMessageBox>
#include<QSqlDatabase>
#include<QSqlQuery> //sql查询语句
stusql::stusql(QObject *parent) : QObject(parent)
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("data.db");
if (!db.open()){
QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));
}
QSqlQuery Query(db);
}
卡在QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));
错误提示no matching function for call to ‘QMessageBox::warning(stusql*, QString, QString)’ 15 | QMessageBox::warning(this, tr("错误"),tr("数据库连接失败")); 你这个是在线程中调用的吗? 看报错是QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));里第一个参数的类型不匹配啊,看着像隐式类型转换失败了 psvajaz 发表于 2023-3-24 16:26
你这个是在线程中调用的吗?
差不多,做了一个数据库连接操作类吧,数据库连接放在构造函数中,QMessageBox::warning不用又不知道什么报警提示好 yixinBC 发表于 2023-3-24 16:28
看报错是QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));里第一个参数的类型不匹配啊,看着 ...
this错了吗 那怎么改啊 dong555 发表于 2023-3-24 16:32
差不多,做了一个数据库连接操作类吧,数据库连接放在构造函数中,QMessageBox::warning不用又不知道什么 ...
不建议直接在操作类中调用UI的东西,应该使用throw或emit把错误信息回调到窗体类中进行提示 本帖最后由 psvajaz 于 2023-3-24 16:46 编辑
dong555 发表于 2023-3-24 16:32
差不多,做了一个数据库连接操作类吧,数据库连接放在构造函数中,QMessageBox::warning不用又不知道什么 ...
这个是我自己写的一个MySQL操作类的构造函数,你可以参考一下
///
/// \brief The Exception class 异常捕捉类
///
class SQLException{
public:
///
/// \brief ErrorCode 错误代码
///
QString ErrorCode;
///
/// \brief ErrorType 错误类型
///
QString ErrorType;
///
/// \brief ErrorText 错误内容
///
QString ErrorText;
///
/// \brief Message 提示信息
///
QString Message;
///
/// \brief SQLException 异常捕捉类
/// \param errorCode 错误代码
/// \param errorType 错误类型
/// \param errorText 错误内容
/// \param message 提示信息
///
SQLException(QString errorCode, QString errorType, QString errorText, QString message){
this->ErrorCode = ErrorCode.replace("\"", "'");
this->ErrorType = errorType.replace("\"", "'");
this->ErrorText = errorText.replace("\"", "'");
this->Message = message.replace("\"", "'");
}
};
/// \brief MySQLHelper 构造函数
/// \param host 服务器地址
/// \param port 端口
/// \param user 账号
/// \param password 密码
///
MySQLHelper::MySQLHelper(QString host, int port, QString user, QString password)
{
if (QSqlDatabase::contains(host + ":" + QString::number(port))){
this->dbconn = QSqlDatabase::database(host + ":" + QString::number(port));
} else {
this->dbconn = QSqlDatabase::addDatabase("QMYSQL", host + ":" + QString::number(port));
this->dbconn.setHostName(host);
this->dbconn.setPort(port);
this->dbconn.setUserName(user);
this->dbconn.setPassword(password);
}
if (!this->dbconn.isOpen()){
if (!this->dbconn.open()){
try{
this->checkError(this->dbconn.lastError());
} catch (SQLException e) {
throw SQLException(e.ErrorCode, e.ErrorType, e.ErrorType, e.Message);
}
}
}
}
////// \brief checkError 处理SQL异常
/// \param sqlError
///
void MySQLHelper::checkError(QSqlError sqlError)
{
if (sqlError.type() != QSqlError::NoError){
switch (sqlError.type()) {
case QSqlError::ConnectionError:
throw SQLException(sqlError.nativeErrorCode(), QString::number(sqlError.type()), sqlError.text(), "Connection error.");
break;
case QSqlError::StatementError:
throw SQLException(sqlError.nativeErrorCode(), QString::number(sqlError.type()), sqlError.text(), "SQL statement syntax error.");
break;
case QSqlError::TransactionError:
throw SQLException(sqlError.nativeErrorCode(), QString::number(sqlError.type()), sqlError.text(), "Transaction failed error.");
break;
case QSqlError::UnknownError:
throw SQLException(sqlError.nativeErrorCode(), QString::number(sqlError.type()), sqlError.text(), "Unknown error.");
break;
default:
throw SQLException(sqlError.nativeErrorCode(), QString::number(sqlError.type()), sqlError.text(), "Unknown error.");
break;
}
}
}
在您的代码中,QMessageBox类需要一个父对象作为参数,但是QObject::parent()是只在QObject的派生类中才有的函数,而stusql类并没有继承QObject类,所以不能直接使用this作为QMessageBox的父对象。因此,您需要将QMessageBox的父对象设置为NULL或者使用其他QWidget对象作为父对象。 你这不是UI界面,不能用this,改成nullptr就好了
页:
[1]