qt QGroupButton 实现两个QPushButton的互斥

发布于:2025-04-19 ⋅ 阅读:(50) ⋅ 点赞:(0)
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();
    }
});

网站公告

今日签到

点亮在社区的每一天
去签到