From 104dfe9693aa9bd9d637de8a98e229bcb28da540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=AB=E5=9C=B0=E5=83=A7?= <357099073@qq.com> Date: Fri, 3 Apr 2026 23:56:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 15 +++ logo.ico | Bin 0 -> 19492 bytes ui/__pycache__/dialog_style.cpython-314.pyc | Bin 11255 -> 13296 bytes ui/__pycache__/dock.cpython-314.pyc | Bin 85600 -> 92705 bytes ui/dialog_style.py | 49 +++++++++- ui/dock.py | 102 ++++++++++++++++++++ 6 files changed, 161 insertions(+), 5 deletions(-) create mode 100644 .gitignore create mode 100644 logo.ico diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a4e2c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Python 编译文件 +__pycache__/ +*.py[cod] +*.so +ui/__pycache__/ + +# 打包exe相关 +dist/ +build/ +*.spec + +# 编辑器 +.idea/ +.vscode/ +*.swp \ No newline at end of file diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..aa94ed2fa82eb44075984a0b8b69062938161e46 GIT binary patch literal 19492 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 ZQq~dS?b_REhXh~ftqq(vufHxh^j}+Y`>g-~ literal 0 HcmV?d00001 diff --git a/ui/__pycache__/dialog_style.cpython-314.pyc b/ui/__pycache__/dialog_style.cpython-314.pyc index e953faea08586e013c5796a09e4200a0954bb29f..030c621d2ce125ee951a9bda1dfe4514112d76ed 100644 GIT binary patch delta 5053 zcmbtYdu&_f760zNeq29dr;VM&cKpbrN!>Q-W2Ha~C~0U(AxRxm5T8WknSX)sDfixupO@dp|E)#pObH00x z(+=pQT`A|D-#OnsukUr7j1Z1EhFDBbi=8$!F*NJ7VR_FKMBFvef!2vI(@Zd7_qPGM7aTFIIl-OOb3q#T>b zjg4fcV<~i@oV9p^TQvDQ92W?xI@kve*DQ>w_h`C(oY3kjgZp%w`!(HtVAH4SU?k6JDU52$5zYun=pY3~ zv3?VpF2!L5b&%DAnbdSy2*#!Afa(r&nvOz(9#sd^@Ew+NM$=8_IUy7*qr-aH@|yB6 zE1M2Fd97?+JS%A@k5$vbZe4eWrrXV9)pXF$YgOB;>H2xBnhqj7$+NNzXvzqWWz)f+ zZgfb~4T3|Ts)J!(tJ(ogH_Qu79#sb;y2DXTH^Ln1Ai-dI|NliJ< zvd}>mjAGd)HC>iBLe+FI3r2C89@ccTJWi7i4(q|>HQiwd#--|@Q-F%*VLx>VT1f?* zCmrk-G>3O+y4`{hf|6>W7jz8^2DPsYIlrq6`q3!Z+^gyO1rBzj4kCgU=zyk+2z;B- zd09uW?~NjLDYT~Z_9{FxxI+lUO6}eNfX6` zhT@UQ$h`8mnr6a)X@o4j~O>kc$`<&R0_Df(MM7nH zw#rmUdB^q3rX%WI8!9H38dK9@hl%>52ejsq{P4 zhUQIL^8;~E>7YcZlqgl}R(4HiJ}l7hplKmBk^&N+$zj&5p^&!!U9l{cvT-WKCMTp^EI62#aL+y#UC zqF7TDy#>)*6k7^n%QX9O11w-x0$%V%Ah6echc>j_9KNwtpzuZXLsson^ zXIb^Wy;>FE{Y4HBkhf~XyV}Xy?Y3PzgtxbIK$SnbvTN8WYQplSWx4^U!6+x?ltl4J zDj8&0XtYdO`2d|6UatX-= zyH^$9{gKU~8sQD~2F{F}l{nU_Hsq>_dz-onxLS2JvH8>*6uO8hbjb}ITt|Ji9_}_} zZ^)}0sePwz_^b1D&{R47hLy8kzw*7hbr!l2f(TowSvgzRYr%_!ttTZ|@9Bvk8bA_7 z(u<@I2?ovDQW)H_ zIXrQo5_%cThjdG$Abtz)%Uo9ZU0}QNrEhIbxfHlodye!RyAx)uvtf7Z0T_GTEBjsL z=MDcyrZfglO13@egX~nriTWy88pi;>S_3RwIs&q5lCvdOd_4yGcX3P>$Q-$-oC^$p zZHB3)-UHt>-6bRY#aEg2*=l(zo09hDU?+w~GMUtY>lUV{Tnct`uGek|ZQ!c(Rc(Tp z=sqRg7_zanaQ>)8dAhN!y0W;FD2yuaHP*WDbSR0?zs1;YrvQt}7mbs!vLJlV)!~=S zqjC1rm^zh0lkY}ct+UP*aYOLe4|_>zZpN_3n&056uqmKO!VYRw+Sd%YSA>na2_$Jn zSrgV0kP%NIc}RJ8jW@s&Sd9r}vQj#BFqx8K>G*_1kHVNG#nAc;+k2hLhpi%OT32j7 zW{Yh;W{_>ZYWVEin$~4yecR0tz0~$suCW|AhBJ+12FWavhmky@OosjWugwV6hk=BR zT0oV&=1_G6NX`fZcbLA#YB5V`ItiyudMuVmQfXAq&>4ChhArdxXMoI+%T{7_pB#K4 zdCszFZs!GqQnhYA?*bL1#R3kN%&}M^Ga8GPtg+a^DR~O+*BHefwq%dY49MF$2ITGx zm9!4TRuqMZHhK!iL4!bY zFOVICz;(!R@00x>kfufA`+zhr^CHJD6Cjt6TyYW3bH#-J!?}_Yc&_z|6@C+_H@TF@ z*SGH0E~1-nWfu|LLxFJ7-(K*y7ya7`{%y;6Ctc|fIp>vHAj`FO&VMD~;8rg;IXK59 I0)$2QAAr}%3IG5A delta 3513 zcmb_fU2Idy6~1$?{}MZnA$DRrIClQ*81h4arc2811_*3mLm(Fx*d?svB$wFW*kSHX z_|bydKD1TURzb555o)DYt8I%^sYpES6TI}HYNds?YPMIq5~|dPZuj9L79sVi=gf>@ zgW9GKwZysSJKx;7XTCFYCOGrYP6f9G8|oGKeg2zIivNt>3`WVGo0;UEF}LL&^H`oS zujL){S-zz5uA*y)>c;A=`lO<}S`^*gqLf0GU-y9T<$gf-o%I}xvrVz4mMu8x`d^JB zZ8yJ6dh2veuRrTydt*KC3~0I^W(nXdCDq!jHvkIqIh*uG@I%}W>n-{wK%4nEVny^O zKw-``0~Z0*EV&k4>r}E)_5nFh+$^jPvsv{gsYb{M|C!BTZYa-`3xxO{bGx!1o_AB) z5ly}NJGMPAz`h7Js)Ix9j;HJHJ@5B@twDIlt~aeKCBrNjhDEz;v%SgYLT^=PNWk|* zLF*`LDCuzbQL=q?&T;doi*$yi>ro;tE4v&ok9)LeSh@ibZ{YEOH=1;W8&^{4)q>N? z<8d_;lWv<5PprC~B*d#er;W6Qx$kpQVxo5bLQ0Fq9O0&wcyiV2WOzKSrCO!it88gs z%{YBL-m7&arMp8(b-)64^7sy1fN*z-`M<&AyKn(j;SUSqTbvkn!H0#rkBC(F6VB`- zq%G-4FiMnE_v*ZJKyaf(ONVRVFcA~JDY(PL6>W7S(22NN`;yS{2-Nu9^fRs!(mO$`!4Ss3@C62UQ{48-hHj zY9N~gY!2H7My50he?+1zxPdD%MG&W%^0Dx8|cEc0W8q z>KKW%^kP@FT@#hEK?C4s32lIfNx*baY$X&M5jWS^Xrz;bSRu09g*^qvX5hicrukUg zlglqImafn~h+kuBbEhi=9{cl_#jSPV*q+5aHOdz4LEyHER>`1#^j(&5*`od6UX8Px ziMUD!*bfq!>UNBTCXX1VnV&cIRWA1*nyr*6X1!s)--bcv1Q_g~5whbknok39M}y}h zf6#Hm)A1qbEJbP`HW!E zFn-%dv3!)LgS8VmVdX?(ydGJE8*QRn%xWKOU8f+t##IC*$&;zO_uFG6dQv+U!T9>0 zuCTv#Y^#z^<+e(PfSbq$s2iU2n`mA^vm1={bR?ESIt9Ol{` zOz(ri8>;dVGrRr|s?bsR*uR&A9stVrA1a@#(1kqT9?w;wZ(xqN2VclS#{j;hg1`8+ zw~qk-5sp~~b3^%z{U|;4U!-W?I-dSdd&qW|@-s$BZY5U9G`DZGjqb3YXZDlO-7hk| zwl|lXtIXzdc6}~)Zpm7rMlMHH7-BabyE17F^-o&R#bHvD;sqi0 zCht_Zsd%=wZ>iXC6^sRg#xd57hS!RBD(!8bUbr;i277P6H-X*sR#eB@pMX4 zN!qE$doQ5Wh1Y!ShdUG92t&&5SNYutS7TdtEz$Qd(YKZudYBk`hS%iN?d+4C34ZPW E3jc)z#JA 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 delta 8951 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 diff --git a/ui/dialog_style.py b/ui/dialog_style.py index 2caf3a6..114f0c7 100644 --- a/ui/dialog_style.py +++ b/ui/dialog_style.py @@ -1,12 +1,16 @@ """标准对话框(QMessageBox / QInputDialog / QFileDialog)与当前主题一致。""" from __future__ import annotations +from PyQt6.QtCore import Qt +from PyQt6.QtGui import QTextOption from PyQt6.QtWidgets import ( QFileDialog, QInputDialog, QMessageBox, QWidget, QDialog, + QLabel, + QSizePolicy, ) import ui.theme as theme @@ -29,7 +33,15 @@ def stylesheet() -> str: QMessageBox QLabel {{ color: {fg}; background: transparent; - min-width: 160px; + min-width: 0px; + }} + QMessageBox QLabel#qt_msgbox_label {{ + min-width: 200px; + max-width: 560px; + }} + QMessageBox QLabel#qt_msgboxex_icon_label {{ + min-width: 28px; + max-width: 28px; }} QMessageBox QPushButton {{ min-width: 64px; @@ -127,6 +139,34 @@ def _apply(w: QWidget | None) -> None: w.setStyleSheet(stylesheet()) +def _prepare_qmessagebox(msg: QMessageBox) -> None: + """让提示框按内容换行并自适应宽高(避免固定宽度截断文字)。""" + lbl = msg.findChild(QLabel, "qt_msgbox_label") + if lbl is not None: + lbl.setWordWrap(True) + lbl.setTextFormat(Qt.TextFormat.PlainText) + # 无空格长中文也能在边界处断行,而不是整段挤在一行被裁切 + try: + lbl.setWordWrapMode(QTextOption.WrapMode.WrapAnywhere) + except AttributeError: + pass + lbl.setMinimumWidth(200) + lbl.setMaximumWidth(560) + lbl.setSizePolicy( + QSizePolicy.Policy.Preferred, + QSizePolicy.Policy.MinimumExpanding, + ) + lay = msg.layout() + if lay is not None: + lay.activate() + msg.setSizePolicy( + QSizePolicy.Policy.Preferred, + QSizePolicy.Policy.Preferred, + ) + msg.setMinimumSize(0, 0) + msg.adjustSize() + + def question( parent: QWidget | None, title: str, @@ -146,8 +186,7 @@ def question( if default_button is not None: msg.setDefaultButton(default_button) _apply(msg) - # 防止对话框因为文本长度/默认最小宽度变得过宽 - msg.setFixedWidth(320) + _prepare_qmessagebox(msg) return QMessageBox.StandardButton(msg.exec()) @@ -158,7 +197,7 @@ def warning(parent: QWidget | None, title: str, text: str) -> None: msg.setIcon(QMessageBox.Icon.Warning) msg.setStandardButtons(QMessageBox.StandardButton.Ok) _apply(msg) - msg.setFixedWidth(320) + _prepare_qmessagebox(msg) msg.exec() @@ -169,7 +208,7 @@ def information(parent: QWidget | None, title: str, text: str) -> None: msg.setIcon(QMessageBox.Icon.Information) msg.setStandardButtons(QMessageBox.StandardButton.Ok) _apply(msg) - msg.setFixedWidth(320) + _prepare_qmessagebox(msg) msg.exec() diff --git a/ui/dock.py b/ui/dock.py index 2d740f3..3a147a7 100644 --- a/ui/dock.py +++ b/ui/dock.py @@ -7,6 +7,7 @@ import struct import time as _time import datetime import urllib.request +import webbrowser import qtawesome as qta from PyQt6.QtWidgets import ( QWidget, @@ -647,6 +648,14 @@ class PanelWindow(QWidget): bottom_layout.setContentsMargins(6, 0, 6, 0) bottom_layout.setSpacing(4) + self.menu_btn = QPushButton() + self.menu_btn.setFixedSize(28, 28) + self.menu_btn.setToolTip("菜单") + self.menu_btn.setStyleSheet( + "border:none; background:transparent; border-radius:4px;" + ) + self.menu_btn.clicked.connect(self._show_bottom_menu) + self.theme_btn = QPushButton() self.theme_btn.setFixedSize(28, 28) self.theme_btn.setToolTip("切换亮/暗主题") @@ -671,6 +680,7 @@ class PanelWindow(QWidget): ) self.quit_btn.clicked.connect(self._quit_application) + bottom_layout.addWidget(self.menu_btn) bottom_layout.addStretch() bottom_layout.addWidget(self.theme_btn) bottom_layout.addWidget(self.settings_btn) @@ -787,6 +797,8 @@ class PanelWindow(QWidget): qta.icon("fa5s.sun" if is_dark else "fa5s.moon", color=ic) ) self.theme_btn.setIconSize(QSize(14, 14)) + self.menu_btn.setIcon(qta.icon("fa5s.bars", color=ic)) + self.menu_btn.setIconSize(QSize(14, 14)) self.settings_btn.setIcon(qta.icon("fa5s.cog", color=ic)) self.settings_btn.setIconSize(QSize(14, 14)) self.quit_btn.setIcon(qta.icon("fa5s.sign-out-alt", color=ic)) @@ -827,6 +839,96 @@ class PanelWindow(QWidget): self._settings_win = SettingsWindow(self) self._settings_win.show() + def _show_bottom_menu(self): + menu = QMenu(self) + menu.setStyleSheet(self._bottom_menu_stylesheet()) + menu.addAction(self._make_doubao_icon(), "豆包会话").triggered.connect( + self._open_doubao_session + ) + menu.addAction( + self._make_round_menu_icon("D", "#4d6bfe"), "DeepSeek" + ).triggered.connect( + lambda: self._open_url_in_browser( + "https://chat.deepseek.com/", "DeepSeek" + ) + ) + menu.addAction( + self._make_round_menu_icon("G", "#4285f4"), "Gemini" + ).triggered.connect( + lambda: self._open_url_in_browser( + "https://gemini.google.com/", "Gemini" + ) + ) + # 菜单贴近按钮下方显示,避免漂移到不自然位置 + pos = self.menu_btn.mapToGlobal(self.menu_btn.rect().bottomLeft()) + menu.exec(pos) + + def _bottom_menu_stylesheet(self) -> str: + t = theme.current() + return f""" + QMenu {{ + background: {t['menu_bg']}; + color: {t['menu_color']}; + border: 1px solid {t['menu_border']}; + border-radius: 8px; + padding: 4px; + }} + QMenu::item {{ + padding: 6px 14px; + border-radius: 5px; + background: transparent; + }} + QMenu::item:selected {{ + background: {t['menu_selected']}; + }} + QMenu::separator {{ + height: 1px; + background: {t['menu_border']}; + margin: 4px 8px; + }} + """ + + def _make_doubao_icon(self) -> QIcon: + return self._make_round_menu_icon("豆", "#3b82f6", font_pt=9) + + def _make_round_menu_icon( + self, letter: str, bg_hex: str, *, font_pt: int = 9 + ) -> QIcon: + pm = QPixmap(18, 18) + pm.fill(Qt.GlobalColor.transparent) + p = QPainter(pm) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + p.setBrush(QBrush(QColor(bg_hex))) + p.setPen(Qt.PenStyle.NoPen) + p.drawEllipse(1, 1, 16, 16) + p.setPen(QPen(QColor("white"))) + f = p.font() + f.setPointSize(font_pt) + f.setBold(True) + p.setFont(f) + p.drawText(pm.rect(), int(Qt.AlignmentFlag.AlignCenter), letter) + p.end() + return QIcon(pm) + + def _open_url_in_browser(self, url: str, title: str) -> None: + try: + ok = webbrowser.open(url) + except Exception as e: + dialog_style.warning( + self, "打开失败", f"无法在默认浏览器中打开{title}:{e}" + ) + return + if not ok: + dialog_style.warning( + self, + "打开失败", + f"系统未注册可用的默认浏览器,请手动在浏览器中打开{title}:\n{url}", + ) + + def _open_doubao_session(self): + """用系统默认浏览器打开豆包会话页。""" + self._open_url_in_browser("https://www.doubao.com/chat/", "豆包") + def refresh_groups(self): # 记录当前折叠状态 collapsed_ids = set()