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