我正在尝试将小部件变成可滚动的窗口。但是,我所要做的就是打开一个与我的中央小部件完全独立的QScrollarea。
class Ui_MainWindow(object):
def mainscreen(self, MainWindow):
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.scrollArea = QtWidgets.QScrollArea()
self.scrollArea.setWidget(self.centralwidget)
MainWindow.setCentralWidget(self.centralwidget)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.mainscreen(MainWindow)
MainWindow.show()
app.exec_()
这只是自己打开MainWindow,只有在我执行self.scrollarea.show时,我才能打开滚动区。我不知道QScrollArea是如何工作的,我应该怎么做?
简单说明:滚动区域与主窗口没有关系,因此当主窗口处于打开状态时不会显示。
pyuic
您对对象结构,Qt父级/所有权和如何设置滚动区域感到困惑。
这也是由于您显然试图模仿pyuic生成的文件的结构和行为而导致的,这是绝对不能做到的。这些文件应原样直接使用,无需进行任何修改,并导入到程序的主脚本中。
它们的特殊结构仅用于该目的,并且不应模仿它们的构建方式,因为通过代码创建UI只能通过将QWidget子类(QMainWindow,QDialog等)进行子类化来完成;试图模仿他们所做的事情不仅是不必要的,而且大多数情况下会导致混乱,错误和意外行为,就像您的情况一样。
该唯一正当的理由来打开(和刚读)由pyuic生成的文件是要了解如何在中创建窗口小部件setupUi
,请记住该setupUi
参数(通常,MainWindow
对于QMainWindows,Form
对于QWidgets,Dialog
对于QDialogs,除非在设计器的对象检查器中更改了顶层窗口小部件的名称, )是建立ui的主要小部件。
仅当一个人真正知道自己在做什么时,才应该手动编辑这些文件。在极少数情况下,这被认为是必要的,并且通常是要解决uic模块中非常特定的已知错误,这些错误通常在非常特定的情况下出现。
然后,当使用现有窗口小部件作为参数创建QWidget实例时,结果是新窗口小部件成为现有窗口小部件的子级。
然后,可以通过各种方式来重设窗口小部件:通过使用setWidget()
来设置滚动区域的窗口小部件,或者将窗口小部件设置为QMainWindow的中央窗口小部件。
您的代码会发生什么,是您创建了一个新的QWidget,它成为QMainWindow的子代,并带有以下行:
self.centralwidget = QtWidgets.QWidget(MainWindow)
然后,创建一个滚动区域(没有任何父项):
self.scrollArea = QtWidgets.QScrollArea()
非父级创建的窗口小部件通常被视为顶级窗口,除非将它们添加到布局中(或使用手动重新设置父级setParent()
,但这是另一回事),这会导致父级(设置了布局的窗口小部件)占用新子小部件的所有权。否则,如果您尝试显示“无父母”窗口小部件,它将显示为顶层窗口小部件,这意味着它将具有自己的窗口,并且作为任何顶层窗口小部件,只能通过手动调用show()
或setVisible(True)
(这就是你的情况)。
然后,您尝试设置centralwidget
滚动区域的,这将导致其父级化:
self.scrollArea.setWidget(self.centralwidget)
最后,您将该窗口小部件设置为中央窗口小部件,它将再次将其重新回到主窗口,结果是滚动区域不再具有窗口小部件(继承自QWidget的QObjects只能具有一个家长)。
MainWindow.setCentralWidget(self.centralwidget)
解决方案是正确创建一个QWidget(或您的情况下的QMainWindow)子类,将滚动区域设置为中央窗口小部件(如果您希望那样)并为其内容创建一个新窗口小部件:
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.scrollArea = QtWidgets.QScrollArea()
self.setCentralWidget(self.scrollArea)
self.scrollArea.setWidgetResizable(True)
self.contents = QtWidgets.QWidget()
self.scrollArea.setWidget(self.contents)
# create a layout for the scroll area contents; using the target widget
# as argument of the layout constructor automatically sets the layout on
# the specified widget
layout = QtWidgets.QVBoxLayout(self.contents)
# the same as:
# layout = QtWidgets.QVBoxLayout()
# self.contents.setLayout(layout)
for row in range(20):
button = QtWidgets.QPushButton('button {}'.format(row + 1))
layout.addWidget(button)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句