【问题标题】:Prevent clipping the absolute positioned child widget by the parent防止父级裁剪绝对定位的子小部件
【发布时间】:2019-06-29 11:03:49
【问题描述】:

我正在尝试创建一个布局,其中存在一行,并且该行应包含一个绝对定位的按钮,该按钮应放置在该行之外。

这是简单的模式

我只是将一个子按钮推入父按钮(我不确定这是一个正确的解决方案)并将其移动到某个绝对坐标。 它可以工作,但不幸的是,子按钮被父按钮剪裁。所以它就像 CSS 中的overflow: hidden。但在 QT 的情况下,我找不到如何禁用此行为。

这是我当前 QUI 的演示

有什么办法可以解决吗?还是我应该只使用一些小部件与空白垫片等组合?

    btn = QPushButton("button")

    test = QPushButton("X")
    test.setParent(btn)
    test.move(200, 5)

    self.layout.addWidget(btn)

UI 类的完整代码(最小可重现示例)

class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.layout = QVBoxLayout()
        btn = QPushButton("button")

        test = QPushButton("X")
        test.setParent(btn)
        test.move(200, 5)

        self.layout.addWidget(btn)

        self.setLayout(self.layout)
        self.layout.setContentsMargins(0,0,0,74)
        self.layout.setSpacing(0)
        # self.layout.addStretch(-1)
        self.setMinimumSize(640,400)
        self.setWindowFlags(Qt.FramelessWindowHint)

【问题讨论】:

  • 您可以尝试使用QGridLayout 并将所有大按钮放在第一列,将两个较小的按钮放在第二列。
  • S.缺口。添加了一个最小的可重现示例。希望它对@Heike有所帮助 - 感谢您的建议,但我想知道是否有任何其他方法可以防止绝对 btn 剪辑?
  • @Velidan 我认为您不能在父小部件的边界之外绘制子小部件。要完全绘制test,您可以增加btn 的最小高度,使test 完全落在btn 的边界内。否则,您可以通过将 btntest 都添加到另一个小部件来创建它们。
  • 是的,我明白了。遗憾的是,我认为这可能就像在 css 的情况下一样。谢谢

标签: python pyqt qwidget qlayout


【解决方案1】:

对不起,@Heike 的建议是绝对正确的,你不应该寻找错误的解决方案。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MainWindow(QWidget):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setMinimumSize(640,400)
        self.setWindowFlags(Qt.FramelessWindowHint)        

        btn = QPushButton("button")   

        test = QPushButton("X")
        test.setParent(btn)
#        test.move(200, 5)

#        self.layout = QVBoxLayout()
        self.layout = QGridLayout()        
        self.layout.addWidget(btn,  0,  0, 1, 10)
        self.layout.addWidget(test, 0, 11, 1,  1)           

        self.layout.setContentsMargins(0,0,0,74) 
        self.layout.setSpacing(0)
        self.setLayout(self.layout)

if __name__ == '__main__':
    import sys
    application = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(application.exec_()) 

【讨论】:

  • 感谢您的帮助。我刚刚计算了应该是“外部”的按钮的宽度以及这个 btn 和大按钮之间的间距。例如 15 宽度 + 15 间距 = 30(例如)然后我将容器的宽度增加到 60,并在此容器中添加了 left-padding: 30px。顺便提一句。这些道具是什么意思?你能描述一下我吗?关于文档: int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 您将其设置为第 10 列吗? self.layout.addWidget(btn, 0, 0, 1, 10)self.layout.addWidget(test, 0, 11, 1, 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2012-06-29
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多