dong555 发表于 2023-3-24 16:22

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("数据库连接失败"));

psvajaz 发表于 2023-3-24 16:26

你这个是在线程中调用的吗?

yixinBC 发表于 2023-3-24 16:28

看报错是QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));里第一个参数的类型不匹配啊,看着像隐式类型转换失败了

dong555 发表于 2023-3-24 16:32

psvajaz 发表于 2023-3-24 16:26
你这个是在线程中调用的吗?

差不多,做了一个数据库连接操作类吧,数据库连接放在构造函数中,QMessageBox::warning不用又不知道什么报警提示好

dong555 发表于 2023-3-24 16:34

yixinBC 发表于 2023-3-24 16:28
看报错是QMessageBox::warning(this, tr("错误"),tr("数据库连接失败"));里第一个参数的类型不匹配啊,看着 ...

this错了吗 那怎么改啊

psvajaz 发表于 2023-3-24 16:39

dong555 发表于 2023-3-24 16:32
差不多,做了一个数据库连接操作类吧,数据库连接放在构造函数中,QMessageBox::warning不用又不知道什么 ...

不建议直接在操作类中调用UI的东西,应该使用throw或emit把错误信息回调到窗体类中进行提示

psvajaz 发表于 2023-3-24 16:44

本帖最后由 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;
      }
    }
}

psvajaz 发表于 2023-3-24 17:33

在您的代码中,QMessageBox类需要一个父对象作为参数,但是QObject::parent()是只在QObject的派生类中才有的函数,而stusql类并没有继承QObject类,所以不能直接使用this作为QMessageBox的父对象。因此,您需要将QMessageBox的父对象设置为NULL或者使用其他QWidget对象作为父对象。

Eaglecad 发表于 2023-3-24 17:44

你这不是UI界面,不能用this,改成nullptr就好了
页: [1]
查看完整版本: QT连接Sqlite卡在QMessageBox::warning