import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QButtonGroup, QVBoxLayoutclass ExampleApp(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):# 創建兩個 QPushButtonself.button1 = QPushButton("按鈕1", self)self.button1.setCheckable(True) # 設置按鈕為可選中狀態self.button1.setChecked(True) # 默認選中按鈕1self.button2 = QPushButton("按鈕2", self)self.button2.setCheckable(True) # 設置按鈕為可選中狀態# 創建 QButtonGroup 并將兩個按鈕加入到按鈕組中self.buttonGroup = QButtonGroup(self)self.buttonGroup.addButton(self.button1)self.buttonGroup.addButton(self.button2)# 設置按鈕組為互斥模式(默認就是互斥的)self.buttonGroup.setExclusive(True)# 布局layout = QVBoxLayout()layout.addWidget(self.button1)layout.addWidget(self.button2)self.setLayout(layout)# 設置窗口屬性self.setWindowTitle("QButtonGroup 示例")self.setGeometry(300, 300, 300, 200)if __name__ == "__main__":app = QApplication(sys.argv)ex = ExampleApp()ex.show()sys.exit(app.exec_())
另一種方式
RoutesItem ::RoutesItem (QWidget *parent): QPushButton(parent)
{setCheckable(true);setStyleSheet("QPushButton {""border-bottom: 1px solid gray;""border-top: 1px solid gray;""border-radius: 0;""padding: 0;" // 設置按鈕的內邊距"}""QPushButton:checked {""background-color: lightgray;""border: none;""border-bottom: 1px solid rgb(70, 70, 70);""border-left: 10px solid rgb(70, 70, 70);""border-radius: 0;""}""QLabel {""background-color: transparent;""}");
...
}QButtonGroup *buttonGroup = new QButtonGroup(ui->scrollAreaWidgetContents);
RoutesItem *item = new RoutesItem(ui->scrollAreaWidgetContents);
...
RoutesItem *item2 = new RoutesItem(ui->scrollAreaWidgetContents);
...
buttonGroup->addButton(item);
buttonGroup->addButton(item2);
buttonGroup->setExclusive(true);
// 至此可以實習互斥選中,如需更多操作如:// 連接按鈕點擊信號
connect(buttonGroup, &QButtonGroup::buttonClicked, this, [](QAbstractButton *btn) {RoutesItem *selectedItem = qobject_cast<RoutesItem *>(btn);if (selectedItem) {// 處理選中的 RoutesItemqDebug() << "Selected item:" << selectedItem->fileName();}
});