簡體   English   中英

在PyQt5中動態定位小部件?

[英]Dynamic positioning of widgets in PyQt5?

我希望我的窗口具有以下布局:

該圖將來自matplotlib。 我想要一種動態創建此布局的方法,以使其適合任何尺寸的屏幕,而無需更改基本布局。 我該怎么做呢? 到目前為止,這是我得到的:

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, 
    QHBoxLayout, QVBoxLayout, QApplication, QFrame, QScrollArea, QListWidget, QListWidgetItem, QLabel)

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        #top left downwards
        vbox = QVBoxLayout() 
        vbox.addStretch(1)
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addLayout(vbox)
        hbox.setDirection(1)
        self.setLayout(hbox)    

        qlist = QListWidget()
        hbox.addWidget(qlist)

        for i in range(0,31):
            qlist.addItem(str(i)) 

        qlist.setFrameStyle(QFrame.Raised)

        vbox2 = QVBoxLayout()
        vbox2.addStretch()

        graph = QFrame(self)
        graph.setStyleSheet("QWidget { background-color: red }" )

        vbox2.addWidget(graph)
        graph.setFrameShape(1)

        self.setStyleSheet("font: 20pt Cambria")
        self.showMaximized()   
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

這給了我這個:

有人知道怎么做嗎? 我是PyQt5的新手,在查看多個示例后不確定框布局如何工作。 有沒有一種更簡單的方法可以在不影響布局的情況下做到這一點? 謝謝!

您要做的第一件事就是設計項目,例如,您有兩個垂直放置的元素:紅色的QFrame和下面的東西,下面的東西命令一個元素處理水平位置,因此它下面必須是QHBoxLayout ,並且放置QFrame並在其下方的元素必須是QVBoxLayout ,這是您可以使用以下方案表示的簡單結構

QWidget
└── QVBoxLayout
    ├── QFrame
    └── QHBoxLayout
        └── QListWidget (with stretch = 1)

我更喜歡先創建小部件,最后將其添加到各自的布局中。

import sys
from PyQt5 import QtWidgets

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # create widgets
        graph = QtWidgets.QFrame()
        graph.setFixedHeight(40)
        graph.setFrameShape(QtWidgets.QFrame.Box)
        graph.setStyleSheet("QWidget { background-color: red }" )

        qlist = QtWidgets.QListWidget()
        qlist.setFrameStyle(QtWidgets.QFrame.Raised)
        qlist.addItems(map(str, range(31)))

        # create QHBoxLayout and add QListWidget
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(qlist)
        hlay.addStretch(1)

        # create QVBoxLayout and add QFrame and QHBoxLayout
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(graph)
        vlay.addLayout(hlay) 

        self.setStyleSheet("font: 20pt Cambria")
        self.showMaximized()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

注意: QFrame沒有一定的高度,因為它的任務是承擔內容的任務,在這種情況下沒有,所以我們必須建立一個固定的大小,如果要向QFrame添加元素,請通過布局並消除setFixedHeight()的行。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM