吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 797|回复: 8
收起左侧

[求助] QT连接Sqlite卡在QMessageBox::warning

[复制链接]
dong555 发表于 2023-3-24 16:22
看了下语法没错啊

把QMessageBox::warning(this, tr("错误"),tr("数据库连接失败")); 注释掉能通过 怎么回事


源代码是这样的
[C++] 纯文本查看 复制代码
#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操作类的构造函数,你可以参考一下
[C++] 纯文本查看 复制代码
///
/// \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对象作为父对象。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
dong555 + 1 + 1 谢谢 改成null确实可以了

查看全部评分

Eaglecad 发表于 2023-3-24 17:44
你这不是UI界面,不能用this,改成nullptr就好了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:22

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表