防止父级剪切绝对定位的子级小部件

时间:2019-06-29 11:03:49

标签: python pyqt qwidget qlayout

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

这是简单的架构

enter image description here

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

这是我当前的QUI的演示

enter image description here

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

    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)

1 个答案:

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

enter image description here