Попытка Windows развертывание - .exe файл не открывается без сообщений об ошибках - PullRequest
1 голос
/ 05 апреля 2020

Я пытался развернуть свое приложение на windows (ноутбук без установленного QT), и я предполагаю, что у меня проблема с зависимостями, но я не получаю сообщений об ошибках.

В настоящее время используется: C: \ Qt \ 5.12.6 \ mingw73_64

Мое приложение прекрасно работает в QtCreator, и я использовал windeployqt (также с добавлением qmldir), который изначально отлично работает. Однако я меняю папку C: \ Qt на C: \ QtHidden (где-то читал, что это имитирует отсутствие установленного QT), и мой файл .exe не загружается. Я могу щелкнуть по нему, но сообщение об ошибке не появляется, мой курсор мыши на несколько секунд меняется на курсор загрузки, а затем ничего не происходит. Кто-нибудь знает, как я могу записать, что происходит, чтобы я мог попытаться это исправить?

Я также пытался следовать https://wiki.qt.io/Deploy_an_Application_on_Windows инструкциям «первоначального развертывания», где я помещал все .dll файл из / bin, и каждая папка из плагинов и qml. Так же не возникает ошибок и проблем с открытием, и я не уверен, что еще я могу сделать.

Есть идеи?

Спасибо

1 Ответ

1 голос
/ 05 апреля 2020

Реализация настраиваемого регистратора сообщений. Я использовал этот код один раз (он есть в моем приложении actall и довольно обобщенно c). Он также может регистрировать ошибки QML:

#include <QDateTime>
#include <QStandardPaths>
#include <QMessageBox>
#include <QDir>
#include <QDebug>
#include <QThread>
#include <QTextStream>
#include <iostream>

QUrl logFileUrl;
bool logToFile=true;
int appLogLevel=3;

void logger(QtMsgType type, const QMessageLogContext &context, const QString &msg){
    bool writeLogLine = false;
    QString line;
    QString msgType;
    QString time = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss.zzz");
    switch (type) {
    case QtInfoMsg:{
        msgType = "Info";
        break;
    }
    case QtDebugMsg:{
        msgType = "Debug";
        break;
    }
    case QtWarningMsg:{
        msgType = "Warning";
        break;
    }
    case QtCriticalMsg:{
        msgType = "Critical";
        break;
    }
    case QtFatalMsg:{
        msgType = "Fatal";
        abort();
    }
    }
    line = QString("[%1] <%2> %3 (%4) | %5:%6 (%7) '%8'")
            .arg(time)
            .arg(static_cast<int>(reinterpret_cast<intptr_t>(QThread::currentThreadId())))
            .arg(msgType)
            .arg(context.category)
            .arg(context.file)
            .arg(context.line)
            .arg(context.function)
            .arg(msg);
    if (!logToFile){
        writeLogLine = false;
        std::cout << line.toStdString() << std::endl;
    } else {
        switch (appLogLevel){
        case 0:{
            writeLogLine = false;
            break;
        }
        case 1:{
            if (type == QtFatalMsg)
                writeLogLine = true;
            break;
        }
        case 2:{
            if (type == QtCriticalMsg || type == QtFatalMsg)
                writeLogLine = true;
            break;
        }
        case 3:{
            if (type != QtInfoMsg && type != QtDebugMsg)
                writeLogLine = true;
            break;
        }
        case 4:{
            if (type != QtDebugMsg)
                writeLogLine = true;
            break;
        }
        case 5:{
            writeLogLine = true;
            break;
        }
        }
    }
    if (writeLogLine){
        QFile logFile(logFileUrl.toLocalFile());
        if (logFile.open(QIODevice::WriteOnly | QIODevice::Append)) {
            QTextStream ts(&logFile);
            ts << line << endl;
            logFile.close();
        } else {
            QMessageBox msgBox;
            msgBox.setWindowTitle("WARNING");
            msgBox.setIcon(QMessageBox::Warning);
            msgBox.setText(logFile.errorString());
            msgBox.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
            msgBox.exec();
        }
    }
}

И установщик использует qInstallMessageHandler:

qInstallMessageHandler(logger);

Проверьте документацию здесь https://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler

PS - этот код также отображает все сообщения в вашем экземпляре QtCreator при запуске оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...