首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Qt 多組 QRadioButton AutoExclusive 衝突問題探討與解決

     編輯:關於.NET

問題現象

原 UI 將 5 個 RadioButton 分兩組:前三個 (radioBtn1-3) 與後兩個 (radioBtn4-5) 各置於一個 VerticalLayout。程式碼設定選中狀態,兩組獨立運作互不干擾。

修改 UI 後,將兩組置於同一 VerticalLayout,程式碼未變,執行發現前三個永無法選中,僅後兩個正常。

根因分析

Qt Assistant 文件說明:

Radio buttons are autoExclusive by default. If auto-exclusive is enabled, radio buttons that belong to the same parent widget behave as if they were part of the same exclusive button group. If you need multiple exclusive button groups for radio buttons that belong to the same parent widget, put them into a QButtonGroup.

同屬一個父 Widget 的 RadioButton 預設為 autoExclusive。程式碼中 radioBtn2 雖被選中,但後續 radioBtn4 將其衝掉。

解決方案

使用 QButtonGroup (父為 QObject) 或 QGroupBox (父為 QWidget) 將兩組分開:

// in ctor
ui.setupUi(this);
QButtonGroup *btnGroup = new QButtonGroup(this);
btnGroup->addButton(ui.radAllConnections);
btnGroup->addButton(ui.radListedConnections);
btnGroup->addButton(ui.radNoTrust);

深入驗證:QLayout 不是 QWidget 子類為何仍衝突?

檢視原始 UI 產生代碼發現:雖然設計器顯示兩個 VerticalLayout,但實際各自包裹在一個 QWidget (layoutWidget2, layoutWidget3) 中,RadioButton 的 parent 為這兩個 Widget,故不屬於同一父 Widget,可各自 autoExclusive。

修改後,兩組 RadioButton 直接置於同一 VerticalLayout,連同其他 Widget 放在同一 Page (QWidget) 上。產生代碼顯示:5 個 RadioButton 的 parent 全變為同一個 settings_firewall_page!

總結與最佳實務

TrollTech 可能為優化 UI 檔案結構而移除中間 Widget。安全起見:

  1. Qt Designer 中將兩組分別放入 QGroupBox。
  2. 或在原始碼中用 QButtonGroup 明確分組。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved