【问题标题】:Works with QGridLayout not with QVBoxLayout适用于 QGridLayout 而不是 QVBoxLayout
【发布时间】:2014-12-24 05:03:09
【问题描述】:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys, os, time

class SetName(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.show()
        toplayout = QVBoxLayout()
        self.setWindowTitle('Personal Info')
        self.form_layout = QFormLayout()
        self.setLayout(self.form_layout)
        self.line_edit_param = QLineEdit(self)

        self.line_edit_param.setPlaceholderText("Write Here")
        self.form_layout.addRow('Write Name', self.line_edit_param)      
        toplayout.addLayout(self.form_layout)
        self.setFocus()

class LearnApp(QDialog):
    def __init__(self):
        super(QDialog, self).__init__()
        self.setWindowTitle("LearnApp")

        self.active = False

        close_button = QPushButton("Close")
        close_button.clicked.connect(self.close)

        self.check_button = QPushButton("Check")
        self.check_button.clicked.connect(self.set_data)        
        self.tr = QTextEdit()
        self.tr.setReadOnly(True)
        # layout
        layout = QHBoxLayout()        
        #layout.addWidget(self.button3)
        sub_layout = QVBoxLayout()
        sub_layout.addWidget(self.check_button)
        sub_layout.addWidget(close_button)
        layout.addLayout(sub_layout)
        layout.addWidget(self.tr)
        self.setLayout(layout)
        self.setFocus()

    def set_data(self):
        print "in set_data"
        SetName()

app = QApplication(sys.argv)
dialog = LearnApp()
dialog.show()
app.exec_()

这是我正在尝试的代码。如果使用toplayout = QGridLayout() 编辑它,程序可以正常工作,但使用toplayout = QVBoxLayout(),它会给出消息QLayout::addChildLayout: layout "" already has a parent,并且只是闪烁新窗口。可能是什么问题呢?我应该如何解决这个问题?我想使用QVBoxLayout 而不是QGridLayout

【问题讨论】:

    标签: user-interface layout pyqt pyqt4 qwidget


    【解决方案1】:

    首先,新窗口会立即消失,因为您没有存储对它的引用。您需要在 LearnApp 类中存储对该实例的引用,或者如果您希望它保留在 set_data() 之外的另一个 Qt 对象,则需要将其作为父对象。

    关于布局的错误消息不是因为您选择了布局,而是因为您正在调用

    self.setLayout(self.form_layout)
    

    然后

    toplayout.addLayout(self.form_layout)
    

    第一次调用将布局分配给SetName 的实例,但这样做也使实例成为self.form_layout 的父级。第二个调用尝试将相同的布局添加到 toplayout 并将其设置为父级,但 Qt 看到 self.form_layout 已经有一个父级(即正在其他地方使用)。这就是错误消息试图告诉您的内容。

    我怀疑你打算写的不是self.setLayout(self.form_layout),而是

    self.setLayout(toplayout)
    

    【讨论】:

    • 嘿,谢谢...当我做出您建议的更改时,该错误消失了,但“个人信息”窗口仍然闪烁。来来去去!为什么会这样?
    • 你是如何存储参考的?您需要确保将其分配为具有self.setname = SetName() 之类的类的成员。如果您只是将其存储在局部变量中(即setname = SetName()),它将在set_data() 返回时立即删除。
    • 酷..!!非常感谢……那是我的错误。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多