使用 macdeployqt 构建 QSqlDatabase 的 Qt 应用程序无法正常工作

Posted

技术标签:

【中文标题】使用 macdeployqt 构建 QSqlDatabase 的 Qt 应用程序无法正常工作【英文标题】:Qt application with QSqlDatabase does not work properly when building it with macdeployqt 【发布时间】:2014-10-02 07:52:21 【问题描述】:

在我的应用程序中,我使用 QSqlDatabase 来存储一些信息。我确实使用以下命令成功构建了它(即使使用verbose=3 也没有错误):

macdeployqt AppName.app/ -dmg -qmldir=~/dev/AppName/qml

在此之前我使用端口成功安装了mysql55

sudo port install mysql55

如果我尝试运行我的应用程序,它不会崩溃,但它也不会涉及数据库访问。

这是我打开数据库等的代码:

#include <QSqlQuery>
#include <QSqlDriver>

const QString DATABASE_NAME = "com.company.program.db";

MyClass::MyClass(QObject *parent) : QObject(parent) 
    mDB = QSqlDatabase::addDatabase("QSQLITE");

    #ifdef Q_OS_LINUX
    QString path(QDir::home().path());
    path.append(QDir::separator()).append(DATABASE_NAME);
    path = QDir::toNativeSeparators(path);
    mDB.setDatabaseName(path);           // NOTE: We have to store database file into user home folder in Linux
    #else
    mDB.setDatabaseName(DATABASE_NAME);  // NOTE: File exists in the application private folder, in Symbian Qt implementation
    #endif

    bool notOpened = !mDB.open();

    QMessageBox::critical(0, "MyClass", mDB.lastError().databaseText()); // always is 'out of memory'

    if (notOpened) emit failedToOpen();
    else 
        // some initialization
    


MyClass::~MyClass() 
    mDB.close();

有没有人遇到过同样的问题/解决了这个问题?

注意:我使用的是 Mac OS X 10.9 和 Qt5.3.2

【问题讨论】:

打开失败后,尝试调用mDB->lastError()->databaseText()获取并查看错误信息 奇怪的是它没有发出信号failedToOpen 获取代码中 if (!mDB.open()) 后面的错误信息 @N1ghtLight 我得到“内存不足”异常。这怎么可能发生?我只有两张表,开头没有任何条目。 Niklas,搜索引擎应该是你最好的朋友...***.com/a/18325616/2266412 【参考方案1】:

数据库驱动程序在运行时加载。如果 db-driver 路径不正确,则在编译过程中不会出现任何与数据库配置相关的错误。 当您在安装了 Qt 的机器上构建时,路径甚至不能不正确。

在 Windows 上,当 exe 无法访问 plugins\sqldrivers 中的文件时,经常会发生这种情况。 MAC上有类似Linux的'strace'吗?如果是,您可以追踪您的 exe 尝试在哪些路径中查找驱动程序插件。

我总是在安装程序中复制整个插件目录并将其部署在可执行文件的根目录中,例如C:\Program Files (x86)\\plugins

希望对你有帮助。

【讨论】:

我在 OS X 上,macdeployqt 正在做所有的事情,比如复制正确的目录;)【参考方案2】:

我通过执行以下代码修复了out of memory 错误:

#ifdef Q_OS_MAC
    QString databaseName = QApplication::applicationDirPath().append("/").append(DATABASE_NAME);
    mDB.setDatabaseName(databaseName);
#endif

【讨论】:

以上是关于使用 macdeployqt 构建 QSqlDatabase 的 Qt 应用程序无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

macdeployqt 在 homebrew 安装的框架上

如何在 Qt 5.4.1 中使用 macdeployqt -codesign 选项

Qt 5.3.1:macdeployqt 尝试包含我硬盘上的所有内容;怎么修?

QT Quick (QML) assemble mac-.bundle -> 使用 macdeployqt 时不是动态库错误

macdeployqt源的位置

部署时不使用 QSoundEffect 播放声音