测试用头文件DebugTool

DebugTool.h

因为常用,所以就单独设置一个头文件,供测试使用。

#pragma once
#include <QApplication>
#include <QDebug>
#include <QDesktopServices>
#include <QFile>
#include <QFileInfo>
#include <QFileSystemWatcher>
#include <QKeySequence>
#include <QProcess>
#include <QShortcut>
#include <QUrl>

#define cout qDebug() << __FILE__ << __LINE__ << ":"
#define toHex(X) QString::number(X, 16)

// 加载QSS文件,并更新样式
inline void loadQssFile(QString fileName)
{
    QFile file(fileName);
    file.open(QFile::ReadWrite | QIODevice::Text); // 如果文件不存在,会创建该文件
    qApp->setStyleSheet(file.readAll());
    file.close();
}

// 监视QSS文件,如果文件有变化,调用 loadQssFile,更新样式
inline void watchQssFile(QString fileName)
{
    QFileSystemWatcher* watch = new QFileSystemWatcher(qApp);
    watch->addPath(fileName);
    QObject::connect(watch, &QFileSystemWatcher::fileChanged, [fileName] {
        //    cout << "watchQssFile";
        loadQssFile(fileName);
    });
}

// 给 w 控件,添加一个快捷键,并 打开指定文件
inline void addShortcut(QWidget* w, QString& fileName)
{
    QShortcut* sc = new QShortcut(w);
    sc->setKey(QKeySequence(Qt::CTRL + Qt::Key_Q, Qt::CTRL + Qt::Key_S));
    QObject::connect(sc, &QShortcut::activated, [fileName] {
        QFileInfo info(fileName);
        cout << info;
        QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath()));
    });
}

测试2

#ifndef DEBUG_H
#define DEBUG_H

#include <QDebug>
#include <QDesktopServices>
#include <QFile>
#include <QFileInfo>
#include <QFileSystemWatcher>
#include <QShortcut>
#include <QApplication>
#include <QUrl>
#include <QTime>
#include <QDebug>
#define qout qDebug().noquote () << __FILE__ << __LINE__ << ": "

#include <QResource>

#include <QJsonDocument>
#include <QJsonObject>


static QString skinFileName;
static QStringList qssFileNames;

// 加载QSS文件,并更新样式
inline void AddQssFile(QString fileName)
{
    if(fileName.contains ("skin"))
        skinFileName = fileName;
    else
        qssFileNames << fileName;
}

inline void refreshQSS()
{
    QByteArray ba_qss;
/*   使用 rcc 资源文件的方式
    QResource::registerResource(qApp->applicationDirPath() + "/theme.rcc");
    QFile file(":/style.qss");
    if(file.open (QFile::ReadOnly) ){
        //        qout << file.readAll ();
        ba_qss = file.readAll ();
        file.close ();
    }
*/

    for (int i = 0; i < qssFileNames.size (); ++i) {
       QFile file(qssFileNames.at (i));
       if(file.open (QFile::ReadOnly | QFile::Text)) {
           QFileInfo finfo(file);
           auto tmpBA = file.readAll () ;
           ba_qss.append (tmpBA);
           file.close ();
       } else {
           qout << file << "can't be opened!";
           return;
       }
    }

    QJsonObject jsonObj;
    QFile skinFile(skinFileName);
    if(skinFile.open (QFile::ReadOnly)){
        QFileInfo finfo(skinFile);
        auto fileContent = skinFile.readAll ();
        QJsonParseError JsonParseError ;
        jsonObj = QJsonDocument::fromJson (fileContent,&JsonParseError).object ();
        if(JsonParseError.error){
            qout << JsonParseError.errorString () << "at" << skinFileName << JsonParseError.offset;
            return;
        }
        skinFile.close ();
    }
    if( jsonObj.isEmpty () )
        return;

    for (auto it = jsonObj.constBegin (); it !=jsonObj.constEnd (); ++it) {
        qout << it.key () << it.value ();
        QString keyWord = "$$"+it.key ();
        auto pos = ba_qss.indexOf (keyWord);
        while (pos >= 0) {
            QChar ch = ba_qss.at (pos + keyWord.length ());
            if(ch.isLetterOrNumber () || ch =='_' ) {
                break;
            }
            ba_qss.replace (pos,keyWord.length (),it.value ().toString ().toUtf8 ());
            pos = ba_qss.indexOf (keyWord);
        }
    }


    auto error = ba_qss.contains ("$$");
    if(error) {
        auto pos = ba_qss.indexOf ("$$");
        auto pos1 = pos;
        --pos;
        while (pos > 0) {
            --pos;
            if(ba_qss.at (pos) == '\n' )
                break;
        }
        ++pos;
        qout << "Could not parse application stylesheet at"
             << pos1 << "\n==>" << ba_qss.mid (pos,ba_qss.indexOf ("\n",pos)-pos).trimmed ();
        qout << ba_qss;
        return;
    }
    qApp->setStyleSheet (ba_qss);
}

// 监视QSS文件,如果文件有变化,调用 loadQssFile,更新样式
inline void watchQssFile(QString fileName,QObject *obj)
{
    AddQssFile(fileName);
    QFileSystemWatcher* watcher = new QFileSystemWatcher(obj);
    watcher->addPath(fileName);
    QObject::connect(watcher, &QFileSystemWatcher::fileChanged, [=](QString path) {
        QFile file(path);
        if(file.size () ==0)
            return;
        refreshQSS();
    });
}

// 给 w 控件,添加一个快捷键,并 打开指定文件
inline void addShortcut(QWidget* w, QString keySequence, QString fileName)
{
    watchQssFile(fileName,w);
    QShortcut* sc = new QShortcut(w);
    sc->setKey(QKeySequence(keySequence));
    QObject::connect(sc, &QShortcut::activated, [fileName] {
        QFileInfo info(fileName);
//        cout << info;
        QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath()));
    });
}
#endif // DEBUG_H

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值