python - 如何制作没有标题栏的选项卡 Pane ?

标签 python python-3.x pyqt pyqt5

我想用 PyQt5 制作如下所示的 GUI,但我找不到示例来帮助我。 我搜索了“更改 qwidget 上的布局”和“没有标题栏的选项卡 Pane ”和“卡片布局”,但没有运气。我怎样才能用 PyQt5 做到这一点?



最佳答案

您必须使用QStackedLayout(或QStackedWidget)来在按下按钮时更改页面。第一页应该有按钮。我还实现了返回初始页面的 back() 方法,按下“更改”按钮时必须调用该插槽:

from functools import partial
from PyQt5 import QtCore, QtWidgets

class CardWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(CardWidget, self).__init__(parent)
        self._layout = QtWidgets.QStackedLayout(self)
        button_widget = QtWidgets.QWidget()
        self.btn_lay = QtWidgets.QFormLayout(button_widget)

        self._layout.addWidget(button_widget)

    def add_widget(self, text, widget):
        self._layout.addWidget(widget)
        btn = QtWidgets.QPushButton(text)
        self.btn_lay.addRow(btn)
        btn.clicked.connect(partial(self._layout.setCurrentWidget, widget))

    @QtCore.pyqtSlot()
    def back(self):
        self._layout.setCurrentIndex(0)


class Widget(QtWidgets.QWidget):
    backSignal = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.le1 = QtWidgets.QLineEdit()
        self.le2 = QtWidgets.QLineEdit()

        button = QtWidgets.QPushButton("Change")
        button.clicked.connect(self.backSignal)

        flay = QtWidgets.QFormLayout()
        flay.addRow("Value 1:", self.le1)
        flay.addRow("Value 2:", self.le2)

        lay = QtWidgets.QVBoxLayout(self)
        lay.addLayout(flay)
        lay.addWidget(button)


def create_label():
    label = QtWidgets.QLabel(
        "Some Other Components", 
        alignment=QtCore.Qt.AlignCenter
    )
    label.setStyleSheet("background-color:blue;")
    return label


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)

    c = CardWidget()
    for i in range(3):
        w = Widget()
        w.backSignal.connect(c.back)
        c.add_widget("Want to Change value {}".format(i+1), w)

    p = QtWidgets.QWidget()
    lay = QtWidgets.QGridLayout(p)
    lay.addWidget(create_label(), 0, 0, 1, 2)
    lay.addWidget(c, 1, 0)
    lay.addWidget(create_label(), 1, 1)
    lay.setColumnStretch(0, 1)
    lay.setColumnStretch(1, 1)
    lay.setRowStretch(0, 1)
    lay.setRowStretch(1, 1)
    p.resize(640, 480)
    p.show()
    sys.exit(app.exec_())

enter image description here

enter image description here

关于python - 如何制作没有标题栏的选项卡 Pane ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54858065/

相关文章:

python - Mac OS X 查找版本返回两条语句

python - Python 3 中的 sys.maxint 是什么?

python - QProxyStyle 与 QStyleSheet

python - PyQT 将一个窗口与另一个 PyQT 窗口连接/拖动... - 相同的程序

Pythonic 方式查找值在范围列表中的位置

python - 为什么线程 ID 变得这么大

python - 在 flask 中重定向时发出 POST 请求

python - 如何使用 Python 将 NULL 数据插入 MySQL 数据库?

python - 制作图像字典

python - 快速简便 : trayicon with python?