QT загрузить файлы ресурсов для отладки - PullRequest
0 голосов
/ 21 февраля 2019

Итак, я создал файл qrc и у меня есть файл в /stylesheets/main.qss.У меня есть информация о таблице стилей в этом файле main.qss.Моя цель здесь - получить файл qss, из которого я могу работать, и, возможно, со временем перезагрузить его.Моя проблема заключается в том, что при отладке в папке сборки отладки нет файла /stylesheets/main.qss.Таким образом, он загружает файл в виде пустой строки, даже не получить исключение.Чего мне не хватает?

main.qss

/*@MainBackgroundColor = rgb(40,40,40)*/
/*@MainBorderColor = rgb(0,102,255)*/
/*@MainTextColor = rgb(255,255,255)*/

*
{
    color: rgb(255,255,255);
    background-color: rgb(40,40,40);
}

QStatusBar
{
    border-top: 3px solid rgb(0,102,255);
}

Загрузка таблицы стилей

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //We want a frameless window.
    setWindowFlags(Qt::FramelessWindowHint);

    //Load the style sheet into the window
    QFile File(":/stylesheets/main.qss");
    File.open(QFile::ReadOnly);
    QString stylesheet = QLatin1String(File.readAll());

    //Setup the UI
    ui->setupUi(this);
    this->setStyleSheet(stylesheet);
}

MainWindow::~MainWindow()
{
    delete ui;
}

resources.qrc

<RCC>
    <qresource prefix="/">
        <file>stylesheets/main.qss</file>
    </qresource>
</RCC>

.pro file

#-------------------------------------------------
#
# Project created by QtCreator 2019-02-20T18:02:31
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = SmartDraw
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mainwindow.cpp \
    stylesheetloader.cpp

HEADERS += \
        mainwindow.h \
    stylesheetloader.h

FORMS += \
        mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    resources.qrc

DISTFILES += \
    stylesheets/main.qss

РЕДАКТИРОВАТЬ: Найдено решение.Очевидно, Qt не очень хорош в обновлении всего, если у вас есть открытый файл pro.Если происходит что-то сверхъестественное, что-то вроде неправильного, вам нужно запустить Build-> Clean All, затем Build-> Run QMake, чтобы снова все заглохло.

1 Ответ

0 голосов
/ 14 мая 2019

Что я делаю, так это сохраняю файл таблицы стилей (*.qss) рядом с приложением во время отладки.Затем загрузите его в main.cpp и подпишитесь на изменения, используя QFileSystemWatcher.

. Таким образом, я могу редактировать файл *.qss с хорошим редактором, таким как SublimeText, и каждый раз, когда я сохраняю его, я вижуизменения сразу:

#include "mydialog.h"
#include <QApplication>
#include <QDebug>

#include <QFile>
#include <QTextStream>
#include <QSharedPointer>
#include <QFileSystemWatcher>
typedef QSharedPointer<QFileSystemWatcher> QWatcherPtr;

void setStyleSheet(QApplication &a, const QString &strPath, const bool &subscribe = false)
{
    // set stylesheet
    QFile f(strPath);
    if (!f.exists())
    {
        qDebug() << "[ERROR] Unable to set stylesheet," << strPath  << "file not found.";
    }
    else
    {
        // set stylesheet
        f.open(QFile::ReadOnly | QFile::Text);
        QTextStream ts(&f);
        a.setStyleSheet(ts.readAll());
        f.close();
        // subscribe to changes (only once)
        if (!subscribe)
        {
            return;
        }
        QWatcherPtr watcher = QWatcherPtr(new QFileSystemWatcher);
        watcher->addPath(strPath);
        QObject::connect(watcher.data(), &QFileSystemWatcher::fileChanged, &a, 
            [&a, watcher, strPath]() 
        {
            setStyleSheet(a, strPath, false);
        });
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // set stylesheet and subscribe to changes
    setStyleSheet(a, "./style.qss", true);

    MyDialog w;
    w.show();

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