[Bug] 设置页滚轮被下拉框/数字框吃掉,翻页时容易误改配置

Aperta Adatta ai principianti
#431 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
1/5
Tempo stimato
Meno di un'ora
Idoneità per principianti
90/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
python
Ambito
desktop

Direzione di ricerca

Tutto avviene in SettingsDialog.add_section() in tool/gui/settings_dialog.py, la classe base condivisa su cui si basa ogni pagina delle impostazioni del kernel. Inizia leggendo quel metodo, poi al suo interno percorri con findChildren i figli della sezione caricata di tipo QComboBox, QSpinBox e QDoubleSpinBox e imposta Qt.StrongFocus su ciascuno prima di aggiungere il widget a content_layout. Fatto significa aprire una pagina delle impostazioni del kernel (ad es. l'icona a ingranaggio su un kernel qualsiasi), scorrere con il puntatore sopra un menu a discesa/spin box e vedere la pagina scorrere invece del valore che cambia, mentre un controllo cliccato risponde ancora alla rotella.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug Fix / Bug 修复

问题描述

内核设置页(tool/gui/settings_dialog.py 的 SettingsDialog 基类,所有内核共用)用滚轮往下翻页时,鼠标只要经过下拉框/数字框,滚轮就被控件吃掉——变成修改选项值,页面不动。

设置页通常有多个下拉框(截图方式、后台模式、设备选择等),滚动时很容易误改配置,也很难翻到页面下半部分。

复现步骤

  1. 打开任意内核的设置页(例如货币战争 / 神赐珍宝 → 齿轮「设置」);
  2. 鼠标移到面板中部,滚轮向下滚动;
  3. 当指针经过任意 QComboBox(如「截图方式」「后台模式」)或 QSpinBox 时,滚轮不再滚动页面,而是改变该控件的选项/数值;
  4. 继续滚动才能跳过该控件,翻页体验被打断,且有误改配置的风险。

预期行为

滚轮应当滚动设置页;只有当控件已经获得焦点(被点击过)时,滚轮才修改它的值。

截图或录屏

未提供(现象可稳定复现,属 Qt 控件默认行为)。

相关日志

无日志输出(纯 UI 交互问题)。

完整日志(文件上传)

无。

操作系统

Windows 11 家庭版 中文版(10.0.26300,x64)

Python 版本

3.12.10(uv 0.13.6)+ PyQt5 5.15.11

项目版本 / Commit

master @ 488d822


原因与建议修法(供参考)

原因:QComboBox / QSpinBox 默认 focusPolicy = Qt.WheelFocus,鼠标悬停在上方时滚轮事件直接进控件,QScrollArea 收不到。

建议:在 SettingsDialog.add_section() 里统一把这两类控件的焦点策略改成 StrongFocus(点进控件后滚轮才生效):

from PyQt5.QtWidgets import QComboBox, QDoubleSpinBox, QSpinBox

def add_section(self, path):
    section = uic.loadUi(str(path))
    for widget in section.findChildren((QComboBox, QSpinBox, QDoubleSpinBox)):
        widget.setFocusPolicy(Qt.StrongFocus)
    self.content_layout.addWidget(section)
    return section

同一处也能覆盖各内核 ui/*.ui 里的所有下拉/数字框,不用逐个改 .ui。

另:如果希望「悬停也能滚轮改值、但不抢页面滚动」,则需要给控件装事件过滤器,只在 Qt.WheelFocus 且已聚焦时接受 wheel 事件——不过推荐的仍是上面的 StrongFocus,行为最符合常见桌面应用习惯。

Lingua principale
Python
Stelle
568
Fork
10
Merge medio
10h 7m
PR unite (30g)
108

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di syfoud/Simulated_Scepter

Tutte le issue di syfoud/Simulated_Scepter

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.