feat: 全新外观

This commit is contained in:
Chenx Dust
2026-08-04 16:37:39 +08:00
parent d1c65b1118
commit 8ac86c5ec5
8 changed files with 1166 additions and 162 deletions

View File

@@ -19,7 +19,7 @@ endif()
add_compile_definitions(PROJ_VER="${PROJ_VER}")
message("PROJ_VER=${PROJ_VER}")
find_package(Qt6 COMPONENTS
find_package(Qt6 6.5 COMPONENTS
Core
Concurrent
Gui

View File

@@ -4,10 +4,15 @@
#include <QClipboard>
#include <QDesktopServices>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QFontDatabase>
#include <QCoreApplication>
#include <QGuiApplication>
#include <QActionGroup>
#include <QInputDialog>
#include <QStyle>
#include <QStyleHints>
#include <QTimer>
#include "mainwindow.h"
@@ -25,6 +30,23 @@
#include "presentation/presentationhelpers.h"
#include "ui_mainwindow.h"
namespace
{
bool appendStyleSheet(const QString &path, QString &styleSheet)
{
QFile styleFile(path);
if (!styleFile.open(QIODevice::ReadOnly | QIODevice::Text))
{
qWarning().noquote() << "无法加载样式资源:" << path;
return false;
}
styleSheet.append(QString::fromUtf8(styleFile.readAll()));
styleSheet.append('\n');
return true;
}
}
MainWindow::MainWindow(
ApplicationLogger *logger,
ApplicationLogFile *logFile,
@@ -47,6 +69,13 @@ MainWindow::MainWindow(
upgradeSettings();
ui->setupUi(this);
ui->logPlainTextEdit->setFont(
QFontDatabase::systemFont(QFontDatabase::FixedFont)
);
QStyleHints *styleHints = QGuiApplication::styleHints();
applyColorScheme(styleHints->colorScheme());
connect(styleHints, &QStyleHints::colorSchemeChanged,
this, &MainWindow::applyColorScheme);
authenticationDialogs = coordinator->authenticationDialogs();
connectionSession = coordinator->connection();
systemProxySession = coordinator->systemProxy();
@@ -58,9 +87,9 @@ MainWindow::MainWindow(
{
const QString componentName =
component == UpdateComponent::Ui ? QStringLiteral("UI") : QStringLiteral("核心");
ui->versionLabel->setText(
"当前版本:" + QApplication::applicationVersion() +
"\n检查" + componentName + "更新失败\n"
ui->versionLabel->setToolTip(
ui->versionLabel->toolTip()
+ "\n检查" + componentName + "更新失败"
);
});
connect(updateChecker, &UpdateChecker::uiUpdateAvailable, this,
@@ -104,6 +133,8 @@ MainWindow::MainWindow(
{
ui->pushButton2->hide();
}
updateProfileSummary();
updateConnectionState(connectionSession->state());
});
setupTrayIcon();
setupProfileMenu();
@@ -115,6 +146,10 @@ MainWindow::MainWindow(
ui->applicationNameLabel->setText(QApplication::applicationDisplayName());
updateVersionInfo();
updateConnectionState(connectionSession->state());
connect(connectionSession, &ConnectionSession::stateChanged, this,
&MainWindow::updateConnectionState);
// 文件-退出
@@ -128,6 +163,13 @@ MainWindow::MainWindow(
settingWindow->show();
});
connect(ui->settingPushButton, &QPushButton::clicked,
ui->settingAction, &QAction::trigger);
connect(ui->guidePushButton, &QPushButton::clicked,
ui->configurationGuideAction, &QAction::trigger);
connect(ui->openLogPushButton, &QPushButton::clicked,
ui->openLogAction, &QAction::trigger);
// 文件-打开日志文件
connect(ui->openLogAction, &QAction::triggered, this,
[this]()
@@ -380,6 +422,110 @@ void MainWindow::resetZjuConnectUi()
trayConnectAction->setText("连接服务器");
ui->pushButton2->setText("设置系统代理");
ui->pushButton2->hide();
updateConnectionState(ConnectionState::Disconnected);
updateProfileSummary();
}
void MainWindow::applyColorScheme(Qt::ColorScheme scheme)
{
const QString themePath = scheme == Qt::ColorScheme::Dark
? QStringLiteral(":/resource/mainwindow-dark.qss")
: QStringLiteral(":/resource/mainwindow-light.qss");
QString styleSheet;
if (!appendStyleSheet(QStringLiteral(":/resource/mainwindow.qss"), styleSheet)
|| !appendStyleSheet(themePath, styleSheet))
{
return;
}
setStyleSheet(styleSheet);
}
void MainWindow::updateConnectionState(ConnectionState state)
{
QString propertyValue;
QString title;
QString detail;
switch (state)
{
case ConnectionState::Disconnected:
propertyValue = "disconnected";
title = "尚未连接";
detail = "连接后即可访问校园网络资源。";
break;
case ConnectionState::Starting:
propertyValue = "starting";
title = "正在连接";
detail = "正在启动核心并建立安全通道。";
break;
case ConnectionState::Running:
propertyValue = "running";
title = "已连接";
detail = systemProxySession->isEnabled()
? "VPN 通道与系统代理均已启用。"
: "VPN 通道运行中,可按需启用系统代理。";
break;
case ConnectionState::Stopping:
propertyValue = "stopping";
title = "正在断开";
detail = "正在安全关闭当前连接。";
break;
case ConnectionState::Reconnecting:
propertyValue = "reconnecting";
title = "正在重连";
detail = "连接中断,正在按当前策略重新尝试。";
break;
case ConnectionState::Failed:
propertyValue = "failed";
title = "连接失败";
detail = "请查看右侧日志,确认网络与账户配置。";
break;
}
ui->statusTitleLabel->setText(title);
ui->statusDetailLabel->setText(detail);
const QList<QWidget *> styledWidgets{
ui->statusIndicator,
ui->pushButton1
};
for (QWidget *widget : styledWidgets)
{
widget->setProperty("connectionState", propertyValue);
widget->style()->unpolish(widget);
widget->style()->polish(widget);
widget->update();
}
}
void MainWindow::updateProfileSummary()
{
const QString profileName = currentProfileId.isEmpty()
? QStringLiteral("默认")
: currentProfileId;
const QString protocolSetting = settings->value(
"ZJUConnect/Protocol",
"easyconnect"
).toString();
const QString protocol = protocolSetting.compare(
"atrust",
Qt::CaseInsensitive
) == 0 ? QStringLiteral("aTrust") : QStringLiteral("EasyConnect");
const QString server = settings->value(
"ZJUConnect/ServerAddress"
).toString().trimmed();
QStringList details{protocol};
details.append(server.isEmpty() ? QStringLiteral("尚未配置服务器") : server);
if (systemProxySession != nullptr && systemProxySession->isEnabled())
{
details.append(QStringLiteral("系统代理已启用"));
}
ui->profileNameLabel->setText(profileName);
ui->profileDetailLabel->setText(details.join(QStringLiteral(" · ")));
}
void MainWindow::setupTrayIcon()
@@ -622,6 +768,7 @@ void MainWindow::createProfile()
upgradeSettings();
updateVersionInfo();
resetZjuConnectUi();
updateVersionInfo();
clearLog();
refreshProfileMenu();
@@ -844,11 +991,12 @@ void MainWindow::upgradeSettings()
void MainWindow::updateVersionInfo()
{
const VersionInfo &versionInfo = updateChecker->versionInfo();
ui->versionLabel->setText(
"UI 版本:" + versionInfo.uiVersion + " 最新:" + versionInfo.uiLatest + "\n"
"核心版本:" + versionInfo.coreVersion + " 最新:" + versionInfo.coreLatest + "\n"
"当前配置" + (currentProfileId.isEmpty() ? "默认" : currentProfileId)
);
ui->versionLabel->setText("版本 " + versionInfo.uiVersion);
ui->versionLabel->setToolTip(
"UI 版本:" + versionInfo.uiVersion + "最新:" + versionInfo.uiLatest + "\n"
"核心版本" + versionInfo.coreVersion + "(最新:" + versionInfo.coreLatest + ""
);
updateProfileSummary();
}
void MainWindow::showNotification(const QString &title, const QString &content, QSystemTrayIcon::MessageIcon icon)

View File

@@ -53,6 +53,12 @@ private:
void resetZjuConnectUi();
void applyColorScheme(Qt::ColorScheme scheme);
void updateConnectionState(ConnectionState state);
void updateProfileSummary();
void showNotification(
const QString &title,
const QString &content,

View File

@@ -6,142 +6,442 @@
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>325</height>
<width>822</width>
<height>583</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>400</height>
</size>
</property>
<property name="windowTitle">
<string>EZ4Connect</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="5">
<widget class="QPushButton" name="pushButton2">
<property name="text">
<string>设置系统代理</string>
<layout class="QVBoxLayout" name="pageLayout">
<property name="spacing">
<number>12</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>16</number>
</property>
<property name="rightMargin">
<number>16</number>
</property>
<property name="bottomMargin">
<number>16</number>
</property>
<item>
<layout class="QHBoxLayout" name="headerLayout">
<property name="spacing">
<number>12</number>
</property>
</widget>
<item>
<widget class="QLabel" name="applicationIconLabel">
<property name="minimumSize">
<size>
<width>44</width>
<height>44</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>44</width>
<height>44</height>
</size>
</property>
<property name="pixmap">
<pixmap resource="../../resource.qrc">:/resource/icon.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="brandLayout">
<property name="spacing">
<number>1</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="applicationNameLabel">
<property name="text">
<string>EZ4Connect</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="versionLabel">
<property name="text">
<string>版本 dev</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="applicationSubtitleLabel">
<property name="text">
<string>支持 aTrust 与 EasyConnect 协议</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="headerSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="guidePushButton">
<property name="toolTip">
<string>打开配置引导</string>
</property>
<property name="text">
<string>配置引导</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="settingPushButton">
<property name="toolTip">
<string>打开完整设置</string>
</property>
<property name="text">
<string>设置</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="3">
<widget class="QPushButton" name="pushButton1">
<property name="text">
<string>连接服务器</string>
<item>
<layout class="QHBoxLayout" name="workspaceLayout" stretch="0,1">
<property name="spacing">
<number>12</number>
</property>
</widget>
</item>
<item row="0" column="0" rowspan="4" colspan="3">
<widget class="QPlainTextEdit" name="logPlainTextEdit">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="maximumBlockCount">
<number>1000</number>
</property>
</widget>
</item>
<item row="2" column="3" colspan="3">
<widget class="QLabel" name="accountLabel">
<property name="text">
<string>ZJU-Connect 图形界面
支持 aTrust 和 EasyConnect 协议
如遇问题欢迎加入 QQ 群 1037726410 反馈</string>
</property>
</widget>
</item>
<item row="1" column="3" colspan="3">
<widget class="QLabel" name="versionLabel">
<property name="text">
<string>Line 1
Line 2
Line3</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="4">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::Minimum</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="3" colspan="3">
<widget class="QLabel" name="applicationNameLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>20</pointsize>
</font>
</property>
<property name="toolTip">
<string>关注 HITSZ OSA 谢谢喵n(*≧▽≦*)n</string>
</property>
<property name="text">
<string>EZ4Connect</string>
</property>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QPushButton" name="copyLogPushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>复制日志到剪贴板</string>
</property>
<property name="text">
<string>复制日志</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="clearLogPushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>清空窗口中的日志</string>
</property>
<property name="text">
<string>清空日志</string>
</property>
</widget>
</item>
<item row="4" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
<item>
<widget class="QFrame" name="controlPanel">
<property name="minimumSize">
<size>
<width>280</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>336</width>
<height>16777215</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<layout class="QVBoxLayout" name="controlLayout">
<property name="spacing">
<number>12</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>16</number>
</property>
<property name="rightMargin">
<number>16</number>
</property>
<property name="bottomMargin">
<number>16</number>
</property>
<item>
<widget class="QLabel" name="connectionEyebrowLabel">
<property name="text">
<string>VPN 连接</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="statusLayout">
<property name="spacing">
<number>9</number>
</property>
<item>
<widget class="QLabel" name="statusIndicator">
<property name="minimumSize">
<size>
<width>10</width>
<height>10</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>10</width>
<height>10</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="statusTitleLabel">
<property name="text">
<string>尚未连接</string>
</property>
</widget>
</item>
<item>
<spacer name="statusSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="statusDetailLabel">
<property name="text">
<string>连接后即可访问校园网络资源。</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton1">
<property name="minimumSize">
<size>
<width>0</width>
<height>48</height>
</size>
</property>
<property name="text">
<string>连接服务器</string>
</property>
<property name="default">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton2">
<property name="minimumSize">
<size>
<width>0</width>
<height>42</height>
</size>
</property>
<property name="text">
<string>设置系统代理</string>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="controlDivider">
<property name="frameShape">
<enum>QFrame::Shape::HLine</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Shadow::Sunken</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="profileEyebrowLabel">
<property name="text">
<string>当前配置</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="profileNameLabel">
<property name="text">
<string>默认</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="profileDetailLabel">
<property name="text">
<string>EasyConnect · 等待连接</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="controlBottomSpacer">
<property name="orientation">
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QLabel" name="qqGroupLabel">
<property name="text">
<string>如遇问题加 QQ 群反馈1037726410</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="logPanel">
<property name="frameShape">
<enum>QFrame::Shape::StyledPanel</enum>
</property>
<layout class="QVBoxLayout" name="logPanelLayout">
<property name="spacing">
<number>14</number>
</property>
<property name="leftMargin">
<number>16</number>
</property>
<property name="topMargin">
<number>16</number>
</property>
<property name="rightMargin">
<number>16</number>
</property>
<property name="bottomMargin">
<number>16</number>
</property>
<item>
<layout class="QHBoxLayout" name="logHeaderLayout">
<property name="spacing">
<number>8</number>
</property>
<item>
<layout class="QVBoxLayout" name="logTitleLayout">
<property name="spacing">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="logTitleLabel">
<property name="text">
<string>运行日志</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="logSubtitleLabel">
<property name="text">
<string>连接过程与诊断信息</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="logHeaderSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="openLogPushButton">
<property name="toolTip">
<string>在系统中打开完整日志文件</string>
</property>
<property name="text">
<string>打开日志文件</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="copyLogPushButton">
<property name="toolTip">
<string>复制日志到剪贴板</string>
</property>
<property name="text">
<string>复制</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="clearLogPushButton">
<property name="toolTip">
<string>清空窗口中的日志</string>
</property>
<property name="text">
<string>清空</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QPlainTextEdit" name="logPlainTextEdit">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="maximumBlockCount">
<number>1000</number>
</property>
<property name="placeholderText">
<string>连接日志将在这里显示</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
@@ -150,28 +450,10 @@ Line3</string>
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<width>822</width>
<height>33</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true">QMenu::item {
padding: 5px 10px 5px 10px;
}
QMenu::item:selected {
background-color: rgb(0, 85, 127);
color: rgb(255, 255, 255);
}
</string>
</property>
<widget class="QMenu" name="helpMenu">
<property name="title">
<string>帮助</string>
</property>
<addaction name="checkUpdateAction"/>
<addaction name="projectAction"/>
<addaction name="aboutAction"/>
</widget>
<widget class="QMenu" name="fileMenu">
<property name="title">
<string>文件</string>
@@ -192,6 +474,14 @@ Line3</string>
</property>
<addaction name="configurationGuideAction"/>
</widget>
<widget class="QMenu" name="helpMenu">
<property name="title">
<string>帮助</string>
</property>
<addaction name="checkUpdateAction"/>
<addaction name="projectAction"/>
<addaction name="aboutAction"/>
</widget>
<addaction name="fileMenu"/>
<addaction name="profileMenu"/>
<addaction name="helpMenu"/>
@@ -200,9 +490,6 @@ Line3</string>
<property name="text">
<string>关于本软件</string>
</property>
<property name="toolTip">
<string>关于本软件</string>
</property>
<property name="menuRole">
<enum>QAction::MenuRole::AboutRole</enum>
</property>
@@ -277,8 +564,16 @@ Line3</string>
</action>
</widget>
<tabstops>
<tabstop>guidePushButton</tabstop>
<tabstop>settingPushButton</tabstop>
<tabstop>pushButton1</tabstop>
<tabstop>pushButton2</tabstop>
<tabstop>logPlainTextEdit</tabstop>
<tabstop>copyLogPushButton</tabstop>
<tabstop>clearLogPushButton</tabstop>
</tabstops>
<resources/>
<resources>
<include location="../../resource.qrc"/>
</resources>
<connections/>
</ui>

View File

@@ -1,5 +1,8 @@
<RCC>
<qresource>
<file>resource/icon.png</file>
<file>resource/mainwindow.qss</file>
<file>resource/mainwindow-light.qss</file>
<file>resource/mainwindow-dark.qss</file>
</qresource>
</RCC>

View File

@@ -0,0 +1,204 @@
QMainWindow {
background: #141b20;
}
QLabel,
QPlainTextEdit,
QMenuBar,
QMenu {
color: #e6edf1;
}
QMenuBar {
background: #141b20;
border-bottom-color: #2d3a42;
}
QMenuBar::item:selected {
background: #24323a;
}
QMenu {
background: #1d272d;
border-color: #354650;
}
QMenu::item:selected {
background: #243f4d;
color: #9fdcff;
}
#applicationNameLabel {
color: #f0f5f7;
}
#applicationSubtitleLabel,
#logSubtitleLabel,
#logHintLabel,
#supportLabel {
color: #9eafb9;
}
#versionLabel {
background: #26333b;
color: #bdcbd3;
}
#controlPanel,
#logPanel {
background: #1c252b;
border-color: #30404a;
}
#connectionEyebrowLabel,
#profileEyebrowLabel {
color: #a4b4bd;
}
#statusTitleLabel,
#profileNameLabel,
#logTitleLabel {
color: #edf3f6;
}
#statusDetailLabel,
#profileDetailLabel,
#qqGroupLabel {
color: #acbac2;
}
#statusIndicator {
background: #71838e;
}
#statusIndicator[connectionState="starting"],
#statusIndicator[connectionState="reconnecting"] {
background: #dfa24f;
}
#statusIndicator[connectionState="running"] {
background: #55b9e7;
}
#statusIndicator[connectionState="stopping"] {
background: #8b9ca6;
}
#statusIndicator[connectionState="failed"] {
background: #dc7777;
}
QPushButton#guidePushButton,
QPushButton#settingPushButton,
QPushButton#pushButton1,
QPushButton#pushButton2,
QPushButton#openLogPushButton,
QPushButton#copyLogPushButton,
QPushButton#clearLogPushButton {
background: #243038;
border-color: #40545f;
color: #dfe8ed;
}
QPushButton#guidePushButton:hover,
QPushButton#settingPushButton:hover,
QPushButton#pushButton1:hover,
QPushButton#pushButton2:hover,
QPushButton#openLogPushButton:hover,
QPushButton#copyLogPushButton:hover,
QPushButton#clearLogPushButton:hover {
background: #2b3b44;
border-color: #5d7684;
}
QPushButton#guidePushButton:pressed,
QPushButton#settingPushButton:pressed,
QPushButton#pushButton1:pressed,
QPushButton#pushButton2:pressed,
QPushButton#openLogPushButton:pressed,
QPushButton#copyLogPushButton:pressed,
QPushButton#clearLogPushButton:pressed {
background: #192329;
}
QPushButton#guidePushButton:focus,
QPushButton#settingPushButton:focus,
QPushButton#pushButton1:focus,
QPushButton#pushButton2:focus,
QPushButton#openLogPushButton:focus,
QPushButton#copyLogPushButton:focus,
QPushButton#clearLogPushButton:focus {
border-color: #69c4ed;
}
QPushButton#guidePushButton:disabled,
QPushButton#settingPushButton:disabled,
QPushButton#pushButton1:disabled,
QPushButton#pushButton2:disabled,
QPushButton#openLogPushButton:disabled,
QPushButton#copyLogPushButton:disabled,
QPushButton#clearLogPushButton:disabled {
background: #1d272d;
border-color: #2f3e46;
color: #71818a;
}
QPushButton#pushButton1 {
background: #55b9e7;
border-color: #55b9e7;
color: #081820;
}
QPushButton#pushButton1:hover {
background: #6bc7ee;
border-color: #6bc7ee;
}
QPushButton#pushButton1:pressed {
background: #3aa5d5;
}
QPushButton#pushButton1[connectionState="running"],
QPushButton#pushButton1[connectionState="starting"],
QPushButton#pushButton1[connectionState="reconnecting"] {
background: #302626;
border-color: #765252;
color: #efaaaa;
}
QPushButton#pushButton1[connectionState="running"]:hover,
QPushButton#pushButton1[connectionState="starting"]:hover,
QPushButton#pushButton1[connectionState="reconnecting"]:hover {
background: #3a2929;
border-color: #a46a6a;
}
QPushButton#pushButton2 {
background: #203744;
border-color: #37647a;
color: #9fdcff;
}
#controlDivider {
color: #30404a;
}
#logPlainTextEdit {
background: #141c21;
border-color: #30404a;
color: #dae5ea;
selection-background-color: #285b73;
selection-color: #f1f7fa;
}
#logPlainTextEdit:focus {
border-color: #5799b8;
}
QScrollBar::handle:vertical {
background: #485b66;
}
QScrollBar::handle:vertical:hover {
background: #617784;
}

View File

@@ -0,0 +1,204 @@
QMainWindow {
background: #f2f7fa;
}
QLabel,
QPlainTextEdit,
QMenuBar,
QMenu {
color: #202a31;
}
QMenuBar {
background: #f2f7fa;
border-bottom-color: #dbe5eb;
}
QMenuBar::item:selected {
background: #e2f0f7;
}
QMenu {
background: #ffffff;
border-color: #d5e1e8;
}
QMenu::item:selected {
background: #e1f1f9;
color: #176b92;
}
#applicationNameLabel {
color: #18242b;
}
#applicationSubtitleLabel,
#logSubtitleLabel,
#logHintLabel,
#supportLabel {
color: #687985;
}
#versionLabel {
background: #e3eef4;
color: #506b7a;
}
#controlPanel,
#logPanel {
background: #ffffff;
border-color: #d7e3e9;
}
#connectionEyebrowLabel,
#profileEyebrowLabel {
color: #6b7d88;
}
#statusTitleLabel,
#profileNameLabel,
#logTitleLabel {
color: #202a31;
}
#statusDetailLabel,
#profileDetailLabel,
#qqGroupLabel {
color: #60727d;
}
#statusIndicator {
background: #9eacb5;
}
#statusIndicator[connectionState="starting"],
#statusIndicator[connectionState="reconnecting"] {
background: #bc7a27;
}
#statusIndicator[connectionState="running"] {
background: #278bb9;
}
#statusIndicator[connectionState="stopping"] {
background: #71808a;
}
#statusIndicator[connectionState="failed"] {
background: #b94b4b;
}
QPushButton#guidePushButton,
QPushButton#settingPushButton,
QPushButton#pushButton1,
QPushButton#pushButton2,
QPushButton#openLogPushButton,
QPushButton#copyLogPushButton,
QPushButton#clearLogPushButton {
background: #ffffff;
border-color: #c8d7df;
color: #2e3b43;
}
QPushButton#guidePushButton:hover,
QPushButton#settingPushButton:hover,
QPushButton#pushButton1:hover,
QPushButton#pushButton2:hover,
QPushButton#openLogPushButton:hover,
QPushButton#copyLogPushButton:hover,
QPushButton#clearLogPushButton:hover {
background: #f0f7fa;
border-color: #a9c2cf;
}
QPushButton#guidePushButton:pressed,
QPushButton#settingPushButton:pressed,
QPushButton#pushButton1:pressed,
QPushButton#pushButton2:pressed,
QPushButton#openLogPushButton:pressed,
QPushButton#copyLogPushButton:pressed,
QPushButton#clearLogPushButton:pressed {
background: #e3eff4;
}
QPushButton#guidePushButton:focus,
QPushButton#settingPushButton:focus,
QPushButton#pushButton1:focus,
QPushButton#pushButton2:focus,
QPushButton#openLogPushButton:focus,
QPushButton#copyLogPushButton:focus,
QPushButton#clearLogPushButton:focus {
border-color: #167aa8;
}
QPushButton#guidePushButton:disabled,
QPushButton#settingPushButton:disabled,
QPushButton#pushButton1:disabled,
QPushButton#pushButton2:disabled,
QPushButton#openLogPushButton:disabled,
QPushButton#copyLogPushButton:disabled,
QPushButton#clearLogPushButton:disabled {
background: #edf2f4;
border-color: #dde5e9;
color: #9ca8ae;
}
QPushButton#pushButton1 {
background: #167aa8;
border-color: #167aa8;
color: #ffffff;
}
QPushButton#pushButton1:hover {
background: #126b94;
border-color: #126b94;
}
QPushButton#pushButton1:pressed {
background: #0f5a7d;
}
QPushButton#pushButton1[connectionState="running"],
QPushButton#pushButton1[connectionState="starting"],
QPushButton#pushButton1[connectionState="reconnecting"] {
background: #ffffff;
border-color: #c9aaa7;
color: #943f3f;
}
QPushButton#pushButton1[connectionState="running"]:hover,
QPushButton#pushButton1[connectionState="starting"]:hover,
QPushButton#pushButton1[connectionState="reconnecting"]:hover {
background: #fbf3f2;
border-color: #b9807c;
}
QPushButton#pushButton2 {
background: #e7f4fa;
border-color: #bddce9;
color: #176f98;
}
#controlDivider {
color: #dce6eb;
}
#logPlainTextEdit {
background: #f6f9fb;
border-color: #dce6eb;
color: #2e3b43;
selection-background-color: #c4e5f4;
selection-color: #153746;
}
#logPlainTextEdit:focus {
border-color: #65a6c4;
}
QScrollBar::handle:vertical {
background: #c2cfd6;
}
QScrollBar::handle:vertical:hover {
background: #a5b7c0;
}

144
resource/mainwindow.qss Normal file
View File

@@ -0,0 +1,144 @@
QLabel,
QPlainTextEdit,
QMenuBar,
QMenu {
font-size: 13px;
}
QMenuBar {
border-bottom-width: 1px;
border-bottom-style: solid;
padding: 3px 10px;
}
QMenuBar::item {
background: transparent;
border-radius: 4px;
padding: 5px 10px;
}
QMenu {
border-width: 1px;
border-style: solid;
padding: 6px;
}
QMenu::item {
border-radius: 4px;
padding: 7px 24px 7px 10px;
}
#applicationNameLabel {
font-size: 21px;
font-weight: 600;
}
#applicationSubtitleLabel,
#logSubtitleLabel,
#logHintLabel,
#supportLabel {
font-size: 12px;
}
#versionLabel {
border-radius: 4px;
font-size: 12px;
font-weight: 600;
margin-left: 6px;
padding: 4px 6px;
}
#controlPanel,
#logPanel {
border-width: 1px;
border-style: solid;
border-radius: 7px;
}
#connectionEyebrowLabel,
#profileEyebrowLabel {
font-size: 11px;
font-weight: 600;
}
#statusTitleLabel {
font-size: 24px;
font-weight: 600;
}
#profileNameLabel,
#logTitleLabel {
font-size: 17px;
font-weight: 600;
}
#statusIndicator {
border-radius: 5px;
}
QPushButton#guidePushButton,
QPushButton#settingPushButton,
QPushButton#pushButton1,
QPushButton#pushButton2,
QPushButton#openLogPushButton,
QPushButton#copyLogPushButton,
QPushButton#clearLogPushButton {
min-height: 34px;
border-width: 1px;
border-style: solid;
border-radius: 5px;
font-size: 13px;
font-weight: 500;
padding: 0 14px;
}
QPushButton#guidePushButton:focus,
QPushButton#settingPushButton:focus,
QPushButton#pushButton1:focus,
QPushButton#pushButton2:focus,
QPushButton#openLogPushButton:focus,
QPushButton#copyLogPushButton:focus,
QPushButton#clearLogPushButton:focus {
border-width: 2px;
}
QPushButton#pushButton1 {
font-size: 14px;
font-weight: 600;
}
#guidePushButton,
#settingPushButton,
#copyLogPushButton,
#clearLogPushButton,
#openLogPushButton {
min-height: 32px;
font-size: 12px;
}
#logPlainTextEdit {
border-width: 1px;
border-style: solid;
border-radius: 5px;
font-size: 12px;
padding: 8px;
}
QScrollBar:vertical {
background: transparent;
margin: 4px 2px;
width: 10px;
}
QScrollBar::handle:vertical {
border-radius: 4px;
min-height: 30px;
}
QScrollBar::add-line:vertical,
QScrollBar::sub-line:vertical,
QScrollBar::add-page:vertical,
QScrollBar::sub-page:vertical {
background: transparent;
height: 0;
}