Python如何修改單列QVBoxLayout為多列?替換 QWidget 的布局并不那么簡(jiǎn)單,將另一個(gè)對(duì)象分配給存儲(chǔ)其他布局引用的變量。
self.layout = Foo()
widget.setLayout(self.layout)
self.layout = Bar()
對(duì)象與變量不同,對(duì)象本身是執(zhí)行操作的實(shí)體,但變量只是存儲(chǔ)對(duì)象引用的地方。例如,對(duì)象可能是人,并變量我們的名字,所以如果他們改變我們的名字,并不意味著他們改變我們作為一個(gè)人。
解決方案是使用sip.刪除刪除Q布局,然后設(shè)置新的布局:
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import (
QApplication,
QHBoxLayout,
QMainWindow,
QPushButton,
QVBoxLayout,
QWidget,
)
import sip
class TestCase(QMainWindow):
def __init__(self):
super().__init__()
test = QWidget()
self.setCentralWidget(test)
layout = QVBoxLayout(test)
for i in range(10):
temp_btn = QPushButton(str(i))
temp_btn.pressed.connect(self.multi_col)
layout.addWidget(temp_btn)
@pyqtSlot()
def multi_col(self):
cols = [QVBoxLayout(), QVBoxLayout()]
old_layout = self.centralWidget().layout()
while old_layout.count():
child = old_layout.takeAt(0)
widget = child.widget()
if widget is not None:
old_layout.removeItem(child)
cols[0].addWidget(widget)
cols[1], cols[0] = cols[0], cols[1]
sip.delete(old_layout)
lay = QHBoxLayout(self.centralWidget())
lay.addLayout(cols[0])
lay.addLayout(cols[1])
def main():
app = QApplication(sys.argv)
window = TestCase()
window.show()
app.exec_()
if __name__ == "__main__":
main()