import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QButtonGroup, QVBoxLayout
class ExampleApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建两个 QPushButton
self.button1 = QPushButton("按钮1", self)
self.button1.setCheckable(True) # 设置按钮为可选中状态
self.button1.setChecked(True) # 默认选中按钮1
self.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) {
// 处理选中的 RoutesItem
qDebug() << "Selected item:" << selectedItem->fileName();
}
});