在PyQt5中美观地分组按钮

时间:2018-08-13 19:50:54

标签: python pyqt pyqt5 qgroupbox

我想做这样的事情:

enter image description here

我无法找到任何方式对按钮进行分组。即,将它们包围在矩形中,并在“按钮部分”中添加“标题”。

是否可以在PyQt5中执行此操作?

1 个答案:

答案 0 :(得分:2)

您可以在QGroupBoxQToolButton旁边使用QLabel

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

data = [{
        "title": " Y Axis Variables",
        "buttons": [{
                "text": "Add/Quit/Modify",
                "path_icon": "Add.png"
            },
            {
                "text": "Calculate Var",
                "path_icon": "calculate.png"
            },
            {
                "text": "Delete Cal Var",
                "path_icon": "delete.png"
            }
        ]
    },
    {
        "title": "Project",
        "buttons": [{
                "text": "Save",
                "path_icon": "save.png"
            },
            {
                "text": "Add Tab",
                "path_icon": "add.png"
            }
        ]
    }
]


class ToolButton(QtWidgets.QWidget):
    def __init__(self, text, path_icon, parent=None):
        super(ToolButton, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)
        toolButton = QtWidgets.QToolButton()
        toolButton.setIcon(QtGui.QIcon(path_icon))
        toolButton.setIconSize(QtCore.QSize(64, 64))
        label = QtWidgets.QLabel(text)
        lay.addWidget(toolButton, 0, QtCore.Qt.AlignCenter)
        lay.addWidget(label, 0, QtCore.Qt.AlignCenter)
        lay.setContentsMargins(0, 0, 0, 0)


class GroupButton(QtWidgets.QGroupBox):
    def __init__(self, info, parent=None):
        super(GroupButton, self).__init__(parent)
        title = info["title"]
        self.setTitle(title)
        hlay = QtWidgets.QHBoxLayout(self)
        for info_button in info["buttons"]:
            text = info_button["text"]
            path_icon = info_button["path_icon"]
            btn = ToolButton(text, path_icon)
            hlay.addWidget(btn)
        hlay.setContentsMargins(5, 5, 5, 5)
        self.setFixedSize(self.sizeHint())

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        vlay = QtWidgets.QVBoxLayout(self)
        hlay = QtWidgets.QHBoxLayout()
        for val in data:
            gb = GroupButton(val)
            hlay.addWidget(gb)
        hlay.addStretch()
        vlay.addLayout(hlay)
        vlay.addStretch()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

enter image description here