簡體   English   中英

替換QFormLayout中的行時PySide崩潰

[英]PySide crashing when replacing rows in QFormLayout

使用以下代碼示例PySide片段會在按下“添加”,“添加”,“刪除”,“添加”時以及由於其他一些交互序列而出現段錯誤。

  • 的Python:2.7.6
  • PySide:1.2.1
  • QtCore的:4.8.5

碼:

from PySide.QtGui import *
from PySide.QtCore import *

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setObjectName('MainWindow')
        self.baseLayout = QWidget(self)
        self.v_layout = QVBoxLayout(self.baseLayout)
        self.setCentralWidget(self.baseLayout)
        self.form_layout = QFormLayout(self.baseLayout)
        self.v_layout.addLayout(self.form_layout)
        self.button_add = QPushButton(self.baseLayout)
        self.button_add.setText("Add")
        self.v_layout.addWidget(self.button_add)
        self.button_del = QPushButton(self.baseLayout)
        self.button_del.setText("Remove")
        self.v_layout.addWidget(self.button_del)
        self.button_add.clicked.connect(self.add)
        self.button_del.clicked.connect(self.remove)

        self.fields = []

    def add_item(self):
        layout = QHBoxLayout(self.parent())
        line = QLineEdit(self.parent())
        slider = QSlider(self.parent())
        layout.addWidget(line)
        layout.addWidget(slider)
        self.fields.append((layout, line, slider))
        self.form_layout.addRow("Test", layout)

    def add(self):
        for i in range(15):
            self.add_item()

    def remove(self):
        for (layout, line, slider) in self.fields:
            line.deleteLater()
            slider.deleteLater()
        while self.form_layout.itemAt(0):
            child = self.form_layout.takeAt(0)
            if child.widget():
                child.widget().deleteLater()
        self.form_layout.update()
        self.fields = []


def main():
    import sys
    app = QApplication(sys.argv)
    frame = MainWindow()
    frame.show()
    app.exec_()

if __name__ == '__main__':
    main()

這是將復合窗口小部件(在本例中是QSliderQLineEditQVBoxLayout )添加到表單布局的正確方法嗎? 我究竟做錯了什么?

QFormLayout添加“復合控件”的正確方法是創建一個QWidget ,該QFormLayout將成為該布局的父級。

add_item()應該看起來像這樣:

def add_item(self):
    widget = QWidget(self.parent())
    layout = QHBoxLayout(widget)
    line = QLineEdit(widget)
    slider = QSlider(widget)
    layout.addWidget(line)
    layout.addWidget(slider)
    self.fields.append((layout, widget, line, slider))
    self.form_layout.addRow("Test", widget)

(並且刪除字段時,也必須刪除該小部件)。

我認為您沒有以正確的方式創建布局,例如,您嘗試兩次設置base_layout的布局。 您也可以在QLayout上檢查count() ,以查看是否有子級:

from PySide.QtGui import *
from PySide.QtCore import *

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.baseLayout = QWidget(self)
        self.v_layout = QVBoxLayout(self.baseLayout)
        self.setCentralWidget(self.baseLayout)

        self.form_layout = QFormLayout()
        self.v_layout.addLayout(self.form_layout)

        self.button_add = QPushButton()
        self.button_add.setText("Add")
        self.v_layout.addWidget(self.button_add)

        self.button_del = QPushButton()
        self.button_del.setText("Remove")
        self.v_layout.addWidget(self.button_del)

        self.button_add.clicked.connect(self.add)
        self.button_del.clicked.connect(self.remove)

        self.fields = []

    def add_item(self):
        layout = QHBoxLayout()
        line = QLineEdit()
        slider = QSlider()
        layout.addWidget(line)
        layout.addWidget(slider)
        self.fields.append((layout, line, slider))
        self.form_layout.addRow("Test", layout)

    def add(self):
        for i in range(15):
            self.add_item()

    def remove(self):

        while self.form_layout.count() > 0:
            child = self.form_layout.takeAt(0)
            widget = child.widget()
            if widget:
                widget.deleteLater()

        self.form_layout.update()
        self.fields = []


def main():
    import sys
    app = QApplication(sys.argv)
    frame = MainWindow()
    frame.show()
    app.exec_()

if __name__ == '__main__':
    main()

暫無
暫無

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

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