为什么 QGridLayout 小部件在添加新小部件时会移动?

2024-03-03

我似乎无法理解它们是如何工作的。放置多个小部件的最佳方式似乎是 QGridLayout,但是当我将某些内容添加到特定的行/列中,然后决定将某些内容添加到另一行/列中时,一切都会发生变化,这真的很令人沮丧。

例如,我什至无法做像谷歌主页这样简单的布局。当我将搜索栏添加到我想要的位置,然后在其上方添加图像/文本时,所有内容都会进入奇怪的位置等,并且我无法在网上找到有关如何处理它的正确解释。因此,如果有人能以一种可以理解的方式向像我这样的初学者解释它,我会很高兴。

所以当我有以下代码时:

from PyQt6.QtWidgets import *
import sys
import numpy as np
import os
from PyQt6 import QtCore, QtGui
from PyQt6.QtCore import QEvent, Qt
from PyQt6.QtGui import QPalette, QColor
from pathlib import Path




app = QApplication(sys.argv)
    

class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(1024, 768)
        self.setWindowTitle("Tracker")
        

        layout = QGridLayout()
        self.setLayout(layout)
        #layout.setRowMinimumHeight(0, 50)

        #layout.setColumnMinimumWidth(0,50)


        self.input = QLineEdit(self)
        self.input.setPlaceholderText('Enter Username')
        layout.addWidget(self.input,1,1)
        self.input.setFixedSize(300,30)



        self.darkmode_check = QCheckBox('Darkmode',self)
        self.darkmode_check.toggled.connect(self.darkmode)
        self.darkmode_check.setChecked(True)
        self.darkmode_check.move(0,0)
        
    

    def darkmode(self):
            
            if self.darkmode_check.isChecked() == True:
                app.setStyleSheet(Path('D:\CODE\League Code\darkorange.qss').read_text())
            else:
                app.setStyleSheet(Path('D:\CODE\League Code\classic_edit.qss').read_text())   
 
    
       

window = MainWindow()
window.show()
sys.exit(app.exec())

我得到的屏幕就是我想要的。

当我只想在此搜索栏上方添加文本时:

通过增加

self.text = QLabel(self)
self.text.setText('Tracker')
layout.addWidget(self.text,0,1)

我明白了:

到处都是。

有人对 GridLayout 有很好的解释或者可以推荐好的网站吗?我发现了很多关于网格的样子等,但没有任何帮助(还有一些帖子给了我 3x3 网格,一些 4x4 等,我现在很困惑) 我基本上只是想在中间放置一个搜索栏,然后在其上方放置一个文本,然后继续到处添加一些小东西。

谢谢


Qt 基本布局总是尝试evenly将可用空间划分为其“单元格”,每个小部件都将保留该空间(即使它没有使用全部空间)。

请注意,不同的小部件类型也有不同的规模政策 https://doc.qt.io/qt-5/qsizepolicy.html#details告诉布局应该如何分配可用空间并最终设置这些小部件的几何形状。

例如,QLineEdit 有一个Fixed 纵向政策,这意味着它的大小提示将始终被视为唯一有效的高度(这类似于调用setFixedHeight() or setFixedSize()正如你所做的那样)。

相反,QLabel 有一个Preferred大小策略,这意味着如果布局中还有剩余空间,它就可以利用它。

当您只有行编辑时,布局只有该小部件,因此它将把它放置在中心(因为您没有指定对齐方式)。但是当你添加标签时,布局发现行编辑需要非常小的空间,因此它将剩余的空间留给标签,因此你的结果。

对于像这样的简单情况,您可以在添加小部件时指定正确的对齐方式:提供对齐方式时,该项目不会尝试占据整个单元格,并且布局会将其与该布局单元格的可用空间对齐。

        layout.addWidget(self.text, 0, 0, alignment=Qt.AlignBottom)
        layout.addWidget(self.input, 1, 0, alignment=Qt.AlignTop)

请注意,我将该列更改为 0,因为将小部件放置在second如果第一列没有任何内容,unless你想利用setColumnStretch() or setColumnMinimumWidth().

还要考虑到,对于这种带有大量空白空间的“宽”布局,通常最好使用嵌套布局或使用容器小部件。

例如:

        layout = QGridLayout(self)
        centerLayout = QVBoxLayout()
        layout.addLayout(centerLayout, 0, 0, alignment=Qt.AlignCenter)

        # ...
        centerLayout.addWidget(self.text)
        centerLayout.addWidget(self.input)

或者,另一种选择:

        layout = QGridLayout(self)
        centerWidget = QWidget()
        layout.addWidget(centerWidget, 0, 0, alignment=Qt.AlignCenter)

        centerLayout = QVBoxLayout(centerWidget)
        # ... as above

尝试删除alignment上面两个例子中的参数,你就会看到区别。

我建议你做一些实验Qt Designer 中的布局 https://doc.qt.io/qt-5/designer-layouts.html,这使得您可以更轻松地立即了解布局如何在不同的小部件类型中工作和表现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 QGridLayout 小部件在添加新小部件时会移动? 的相关文章

  • 在 sympy 绘图中,如何获得具有固定纵横比的绘图?

    如果我用这个片段画一个圆 from sympy import x y symbols x y p1 plot implicit Eq x 2 y 2 1 aspect ratio 1 1 我会得到一个像这样的图形窗口 现在长宽比不是我所期望
  • matplotlib get_color 用于子图

    我正在按照这里的教程进行操作 https matplotlib org gallery ticks and spines multiple yaxis with spines html https matplotlib org galler
  • Flask - 如何从 JSON GET 请求获取参数

    我有一个发出以下 GET 请求的客户端 api GET tasks 5fe7eabd 842e 40d2 849e 409655e0891d 22task 22 22hello 22 22url 22 22 tasks 5fe7eabd 8
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • 如何逐行替换(更新)文件中的文本

    我试图通过读取每一行 测试它 然后写入是否需要更新来替换文本文件中的文本 我不想保存为新文件 因为我的脚本已经先备份文件并对备份进行操作 这是我到目前为止所拥有的 我从 os walk 获取路径 并且保证 pathmatch var 正确返
  • 点击后 Dash DropDown 关闭

    我不希望下拉菜单在选择值后关闭 我希望它在我的页面上保持打开状态 我正在使用 dcc Dropdown dcc Dropdown id job type options self options placeholder Select one
  • 如何让 Discord 机器人显示“机器人正在输入...”状态?

    所以如果我有一个像这样的长命令 bot command pass context True async def longCommand ctx typing status sleep 10 bot say Done 不幸的是 在文档或此处没
  • 将Python嵌入到C中——导入模块

    我在使用嵌入式 Python for C 时遇到问题文档 http docs python org extending embedding html 每当我尝试使用导入的模块时 我都会得到 PythonIncl exe 中 0x1e089e
  • Python服务器“通常只允许每个套接字地址使用一次”

    我正在尝试用 python 创建一个非常基本的服务器 它侦听端口 当客户端尝试连接时创建 TCP 连接 接收数据 发回某些内容 然后再次侦听 并无限期地重复该过程 这是我到目前为止所拥有的 from socket import server
  • 如何在Python中重命名virtualenv?

    我拼错了名字virtualenv使用以下方法初始化它 virtualenv vnev 我实际上打算创建一个名为的环境venv 尝试重命名后vnev文件夹到venv 我发现这并没有提供太多帮助 激活环境的名称仍然重命名旧的vnev mv vn
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 有什么理由不在Python中混合使用多处理和线程模块

    我正在考虑使用Python来实现一个需要大量多线程的程序 另一个要求是它将在桌面上运行 因此拥有许多进程将使应用程序显得混乱且难以杀死 在任务管理器中 因此 我正在考虑使用线程和多处理模块来减少进程数量 据我了解 GIL 仅适用于单个进程
  • 如何在Python中一次比较二维数组的2列与另一个数组的列

    我有两个字符串数组 每个数组有三列 我想比较两个二维数组的前两列 有 3 列和 4000 行 如果它们匹配 那么我需要那些匹配的值 但是我的代码不起作用 这是一个示例 array1 1stcolumn 2ndColumn 3rdColumn
  • 类型错误:不可散列的类型:pandas 的“切片”

    我有一个 pandas 数据结构 我这样创建 test inputs pd read csv input test csv delimiter 它的形状 print test inputs shape is this 28000 784 我
  • 编写 CherryPy 装饰器以进行授权

    我有一个cherrypy应用程序 在某些视图上我想开始只允许某些用户查看它们 并将其他任何人发送到需要授权的页面 有没有办法使用自定义装饰器来做到这一点 我认为这将是最优雅的选择 这是我想做的一个基本示例 class MyApp autho
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • 如何从集合中检索元素而不删除它?

    假设如下 gt gt gt s set 1 2 3 我如何获得一个值 任何值 s不做s pop 我想将该项目保留在集合中 直到我确定可以删除它 这只有在异步调用另一个主机之后才能确定 又快又脏 gt gt gt elem s pop gt
  • centos上无法安装Pillow

    我上面有 centos 6 3 和 python 2 6 当我尝试通过 easy install 安装它时 出现以下错误 imaging c 76 20 error Python h No such file or directory In
  • Django 表单中的只读字段

    如何在 Django 表单中将字段设置为只读 我知道如何禁用某个字段 但这不是我想要的 任何帮助 将不胜感激 您可以使用可选的attrs定义时的参数Field 以机智 somefield forms CharField widget for

随机推荐