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
答案 0 :(得分: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)