QScrollArea,如何使中央窗口小部件可滚动?

黑猩猩

我正在尝试将小部件变成可滚动的窗口。但是,我所要做的就是打开一个与我的中央小部件完全独立的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Qt:如何创建一个可滚动的,所有者绘制的窗口小部件

来自分类Dev

如何在Qt中更改窗口标题和中央小部件?

来自分类Dev

如何取消与窗口小部件的默认绑定

来自分类Dev

如何访问父窗口小部件元素?

来自分类Dev

从插槽访问中央窗口小部件时出现段故障

来自分类Dev

如何从程序中滚动QTextEdit小部件

来自分类Dev

在QMainWindows中央窗口小部件之间切换

来自分类Dev

Flutter-如何在滚动到屏幕上时创建窗口小部件

来自分类Dev

Flutter-如何制作一个自定义小部件,以将页脚添加到接收到的可滚动小部件中?

来自分类Dev

在制作可重用的窗口小部件时需要帮助

来自分类Dev

如何创建预先的多个可嵌入窗口小部件?

来自分类Dev

页面启动时,如何使可滚动行的中间小部件显示在左侧?

来自分类Dev

WP窗口小部件类别如何向窗口小部件添加文章数量的描述?

来自分类Dev

如何使用PyQt5将打开的cv图像(numpy数组)放入主窗口的中央小部件中?

来自分类Dev

使特定的小部件可滚动

来自分类Dev

在窗口中将小部件滚动出屏幕

来自分类Dev

如何在两个固定的小部件之间制作可滚动的小部件

来自分类Dev

滚动封装的QScrollArea()时缺少窗口小部件的LeaveEvent()

来自分类Dev

如何创建与窗口小部件滚动同步的标签栏?

来自分类Dev

使用QScrollArea折叠子窗口小部件

来自分类Dev

如何实现QListView的Clickable窗口小部件?

来自分类Dev

如何在SplitLayoutPanel中为中央窗口小部件“ setWidgetSize”设置?

来自分类Dev

Qt:如何创建一个可滚动的,所有者绘制的窗口小部件

来自分类Dev

如何从自定义窗口小部件类更改中央窗口小部件?

来自分类Dev

如何每秒更新容器窗口小部件中的标签窗口小部件

来自分类Dev

PySide-从中央窗口小部件中重置主窗口中央窗口小部件

来自分类Dev

无法使小部件可滚动

来自分类Dev

使带有扩展小部件的列可滚动

来自分类Dev

如何使用 RecycleGridLayout 在 RecycleView 中使加载的小部件可滚动?

Related 相关文章

  1. 1

    Qt:如何创建一个可滚动的,所有者绘制的窗口小部件

  2. 2

    如何在Qt中更改窗口标题和中央小部件?

  3. 3

    如何取消与窗口小部件的默认绑定

  4. 4

    如何访问父窗口小部件元素?

  5. 5

    从插槽访问中央窗口小部件时出现段故障

  6. 6

    如何从程序中滚动QTextEdit小部件

  7. 7

    在QMainWindows中央窗口小部件之间切换

  8. 8

    Flutter-如何在滚动到屏幕上时创建窗口小部件

  9. 9

    Flutter-如何制作一个自定义小部件,以将页脚添加到接收到的可滚动小部件中?

  10. 10

    在制作可重用的窗口小部件时需要帮助

  11. 11

    如何创建预先的多个可嵌入窗口小部件?

  12. 12

    页面启动时,如何使可滚动行的中间小部件显示在左侧?

  13. 13

    WP窗口小部件类别如何向窗口小部件添加文章数量的描述?

  14. 14

    如何使用PyQt5将打开的cv图像(numpy数组)放入主窗口的中央小部件中?

  15. 15

    使特定的小部件可滚动

  16. 16

    在窗口中将小部件滚动出屏幕

  17. 17

    如何在两个固定的小部件之间制作可滚动的小部件

  18. 18

    滚动封装的QScrollArea()时缺少窗口小部件的LeaveEvent()

  19. 19

    如何创建与窗口小部件滚动同步的标签栏?

  20. 20

    使用QScrollArea折叠子窗口小部件

  21. 21

    如何实现QListView的Clickable窗口小部件?

  22. 22

    如何在SplitLayoutPanel中为中央窗口小部件“ setWidgetSize”设置?

  23. 23

    Qt:如何创建一个可滚动的,所有者绘制的窗口小部件

  24. 24

    如何从自定义窗口小部件类更改中央窗口小部件?

  25. 25

    如何每秒更新容器窗口小部件中的标签窗口小部件

  26. 26

    PySide-从中央窗口小部件中重置主窗口中央窗口小部件

  27. 27

    无法使小部件可滚动

  28. 28

    使带有扩展小部件的列可滚动

  29. 29

    如何使用 RecycleGridLayout 在 RecycleView 中使加载的小部件可滚动?

热门标签

归档