pyqt5边框仅适用于父小部件问题[重复]

Posted

技术标签:

【中文标题】pyqt5边框仅适用于父小部件问题[重复]【英文标题】:pyqt5 border apply only to parent widget problem [duplicate] 【发布时间】:2020-07-07 11:44:45 【问题描述】:

每个人。我在pyqt5中有一个奇怪的问题。 我尝试更改边框但失败了,我在应用边框样式时总是很头疼。 我的代码来了。请帮助我

from PyQt5.QtWidgets import QWidget,QApplication,QTextEdit
from PyQt5.QtCore import Qt
from PyQt5 import QtWidgets
import sys



class SomeWidget(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setStyleSheet('border:10px solid green')
        pass

class mainWidget(QWidget):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        widget = SomeWidget(self)
        widget.setWindowFlags(Qt.FramelessWindowHint|Qt.Window)
        widget.resize(self.width()//2,self.height()//2)
        
        widget.show()
        # self.setStyleSheet(styles)
        pass

def test1():
    return 0,1

if __name__ == "__main__":

    app = QApplication(sys.argv)
    mw = mainWidget()
    mw.show()
    sys.exit(app.exec_())
    
    pass

【问题讨论】:

【参考方案1】:

这里的问题是 QWidget 类不支持边框属性(参见this answer 和the Qt stylesheet documentation directly)。

话虽如此,将 QWidget 更改为 QFrame 就可以解决问题:

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QFrame


class SomeWidget(QFrame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setStyleSheet('border:10px solid green')


class mainWidget(QWidget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        widget = SomeWidget(self)
        widget.setWindowFlags(Qt.FramelessWindowHint | Qt.Window)
        widget.resize(self.width() // 2, self.height() // 2)

        widget.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = mainWidget()
    mw.show()

    sys.exit(app.exec_())

【讨论】:

【参考方案2】:

试试看:

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QTextEdit
from PyQt5.QtCore import Qt
from PyQt5.Qt import *


class SomeWidget(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
#        self.setStyleSheet('background: #0ff; border: 10px solid green')
        
        self.widget = QWidget(self)
        self.widget.setObjectName('Custom_Widget')
        self.widget.setStyleSheet('''
            QWidget#Custom_Widget 
                background: rgba( 255, 155, 155, 170);
                border-radius: 20px;
                border: 10px solid green;                   
            
        ''')

        self.v = QVBoxLayout(self)
        self.v.setContentsMargins(0, 0, 0, 0)
        self.v.addWidget(self.widget)


class MainWidget(QWidget):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        widget = SomeWidget(self)
        widget.setWindowFlags(Qt.FramelessWindowHint | Qt.Window)
        widget.setAttribute(Qt.WA_TranslucentBackground)                # +++
        widget.resize(self.width()//2, self.height()//2)
        
        widget.move(100, 100)                                           # +++
        widget.show()
        
        self.setStyleSheet('background:#00f;')


def test1():     # ???
    return 0,1

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWidget()
    mw.show()
    sys.exit(app.exec_())

【讨论】:

以上是关于pyqt5边框仅适用于父小部件问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从子小部件调用父小部件中的函数 |扑

Flutter - 无法从父小部件更改子状态

在子小部件中,如何在 kivy 中获取父小部件的实例

如何从 Flutter 中的子小部件调用父小部件功能

如何将父小部件焦点重定向到子小部件?

Flutter 重建父小部件