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();}
});