PySide/PyQt 覆盖小部件

贝努瓦·巴尔德斯

我试图在 PySide 中实现类似的东西:https ://codepen.io/imprakash/pen/GgNMXO我想要做的是创建一个无框的子窗口,下面有一个黑色覆盖层。

我没有成功创建一个无框的子窗口和覆盖...

这是复制 HTML 的基本代码:

from PySide import QtCore, QtGui
import sys

class MainWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(800, 500)

        self.button = QtGui.QPushButton("Click Me")

        self.setLayout(QtGui.QVBoxLayout())
        self.layout().addWidget(self.button)

        # Connections
        self.button.clicked.connect(self.displayOverlay)


    def displayOverlay(self):
        popup = QtGui.QDialog(self)
        popup.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        popup.setLayout(QtGui.QHBoxLayout())
        popup.layout().addWidget(QtGui.QLabel("HI"))
        popup.show()
        print "clicked"

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

如果您使用 FramelessWindowHint 注释该行,则窗口会出现,否则什么也不会发生...

我真的希望有人可以帮助我。感谢您花时间阅读我的问题。

贝努瓦·巴尔德斯

感谢 armatita,我成功地得到了我想要的东西。现在,有一些问题,但它有效,我得到了我想要的结果。

我把代码给下一个寻找同样东西的人。

from PySide import QtCore, QtGui
import sys

class CtmWidget(QtGui.QWidget):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)

        self.button = QtGui.QPushButton("Close Overlay")
        self.setLayout(QtGui.QHBoxLayout())
        self.layout().addWidget(self.button)

        self.button.clicked.connect(self.hideOverlay)

    def paintEvent(self, event):

        painter = QtGui.QPainter()
        painter.begin(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        path = QtGui.QPainterPath()
        path.addRoundedRect(QtCore.QRectF(self.rect()), 10, 10)
        mask = QtGui.QRegion(path.toFillPolygon().toPolygon())
        pen = QtGui.QPen(QtCore.Qt.white, 1)
        painter.setPen(pen)
        painter.fillPath(path, QtCore.Qt.white)
        painter.drawPath(path)
        painter.end()

    def hideOverlay(self):
        self.parent().hide()



class Overlay(QtGui.QWidget):
    def __init__(self, parent, widget):
        QtGui.QWidget.__init__(self, parent)
        palette = QtGui.QPalette(self.palette())
        palette.setColor(palette.Background, QtCore.Qt.transparent)
        self.setPalette(palette)

        self.widget = widget
        self.widget.setParent(self)


    def paintEvent(self, event):
        painter = QtGui.QPainter()
        painter.begin(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.fillRect(event.rect(), QtGui.QBrush(QtGui.QColor(0, 0, 0, 127)))
        painter.end()

    def resizeEvent(self, event):
        position_x = (self.frameGeometry().width()-self.widget.frameGeometry().width())/2
        position_y = (self.frameGeometry().height()-self.widget.frameGeometry().height())/2

        self.widget.move(position_x, position_y)
        event.accept()

class MainWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(800, 500)

        self.button = QtGui.QPushButton("Click Me")

        self.setLayout(QtGui.QVBoxLayout())
        self.layout().addWidget(self.button)
        self.popup = Overlay(self, CtmWidget())
        self.popup.hide()

        # Connections
        self.button.clicked.connect(self.displayOverlay)

    def displayOverlay(self):
        self.popup.show()
        print "clicked"

    def resizeEvent(self, event):
        self.popup.resize(event.size())
        event.accept()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

再次感谢你们(ymmx 和 armatita)在我的问题上花时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

覆盖小部件颤动

来自分类Dev

Django小部件覆盖模板

来自分类Dev

在颤动中覆盖小部件更改子小部件

来自分类Dev

MonkeyPatching:PrimeFaces小部件扩展/覆盖

来自分类Dev

Magento小部件(product_new)覆盖

来自分类Dev

覆盖Django小部件默认模板

来自分类Dev

DOJO:覆盖Dijit小部件中的方法

来自分类Dev

Qt,更改小部件覆盖图?

来自分类Dev

覆盖Primefaces特定小部件中的方法

来自分类Dev

在图像框架上覆盖 tkinter 小部件

来自分类Dev

OroPlatform:如何覆盖 datetimepicker js 小部件

来自分类Dev

调整窗口大小而不覆盖小部件

来自分类Dev

如何从覆盖另一个小部件的小部件中删除透明度?

来自分类Dev

QT:如何在不覆盖小部件类的情况下为小部件设置 resizeEvent

来自分类Dev

是否可以覆盖核心颤振 Scaffold 小部件的功能?

来自分类Dev

CSS覆盖小部件外部的所有先前样式

来自分类Dev

在 WordPress 中自动覆盖带有小部件的弹出窗口?

来自分类Dev

动态设置 Padding 小部件,以便 FAB 不覆盖 Column

来自分类Dev

如何在javascript中编辑/覆盖小部件的布局?

来自分类Dev

Odoo 9.如何覆盖表单小部件?

来自分类Dev

如何使用Flutter中的Stack小部件部分覆盖视图

来自分类Dev

Android显示浮动窗口小部件覆盖不起作用

来自分类Dev

覆盖小部件部分超出其父级的边界

来自分类Dev

覆盖基于Django通用类的视图小部件

来自分类Dev

如何在Django中覆盖模型表单小部件?

来自分类Dev

放置在小部件中时,Wordpress <img> 样式被覆盖

来自分类Dev

如何在WordPress的子主题中覆盖小部件?

来自分类Dev

Flutter 从每个屏幕切换覆盖小部件

来自分类Dev

覆盖pyqt中现有小部件的绘画事件

Related 相关文章

热门标签

归档