gpt4 book ai didi

python - 删除 QMdiSubWindow 的图标和样式

转载 作者:行者123 更新时间:2023-12-01 00:47:07 24 4
gpt4 key购买 nike

我注意到 QMdiarea 的窗口需要自定义样式。我想删除 QMdiSubWindow 小部件左上角出现的图标,同时将窗口的丑陋蓝色更改为看起来相当不错的颜色。

我已经尝试了 setWindowsflag,但没有效果。

代码:

class Mywindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Mywindow, self).__init__(parent)

self.setMinimumSize(QtCore.QSize(800,600))
self.setWindowTitle('Customized style')
self.mdiarea = QtWidgets.QMdiArea()
self.setCentralWidget(self.mdiarea)
self.mdiarea.setWindowTitle('Test')

self.window = QtWidgets.QWidget()
self.mdiarea.addSubWindow(self.window)

if __name__ == '__main__':
import sys

app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
view = Mywindow()
view.showMaximized()
sys.exit(app.exec_())

当前显示:

enter image description here

想要获得:

enter image description here

知道如何实现这一目标吗?

最佳答案

至少有2个解决方案:

<强>1。使用Qt样式表

您必须使用 QMdiSubWindow: title 的“background”属性来更改颜色,要删除图标,技巧是向其传递一个透明颜色的图标

from PyQt5 import QtCore, QtGui, QtWidgets

QSS = """
QMdiSubWindow:title{
background: lightgray;
}
"""


def create_icon_by_color(color):
pixmap = QtGui.QPixmap(512, 512)
pixmap.fill(color)
return QtGui.QIcon(pixmap)


class Mywindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Mywindow, self).__init__(parent)
self.setWindowTitle("Customized style")
self.mdiarea = QtWidgets.QMdiArea()
self.setCentralWidget(self.mdiarea)
self.mdiarea.setWindowTitle("Test")

self.window = QtWidgets.QWidget()
self.window.setMinimumSize(320, 240)
sw = self.mdiarea.addSubWindow(self.window)
sw.setWindowIcon(create_icon_by_color(QtGui.QColor("transparent")))


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
app.setStyle("Fusion")
app.setStyleSheet(QSS)
view = Mywindow()
view.show()
sys.exit(app.exec_())

enter image description here

正如您在我的操作系统中看到的,它的中间有一个不希望的白色,用于为子窗口的标题着色,也许在另一个操作系统中它不会产生这个问题。

<强>2。使用 QProxyStyle

在这种情况下,您可以修改样式,因此它应该是比前一个更强大的解决方案,并且不应具有其他样式。为了进行简单的操作,我创建了一个自定义 QMdiSubWindow。

from PyQt5 import QtCore, QtGui, QtWidgets

def create_icon_by_color(color):
pixmap = QtGui.QPixmap(512, 512)
pixmap.fill(color)
return QtGui.QIcon(pixmap)


class TitleProxyStyle(QtWidgets.QProxyStyle):
def drawComplexControl(self, control, option, painter, widget=None):
if control == QtWidgets.QStyle.CC_TitleBar:
if hasattr(widget, "titleColor"):
color = widget.titleColor
if color.isValid():
option.palette.setBrush(
QtGui.QPalette.Highlight, QtGui.QColor(color)
)
option.icon = create_icon_by_color(QtGui.QColor("transparent"))
super(TitleProxyStyle, self).drawComplexControl(
control, option, painter, widget
)


class MdiSubWindow(QtWidgets.QMdiSubWindow):
def __init__(self, parent=None, flags=QtCore.Qt.Widget):
super(MdiSubWindow, self).__init__(parent, flags)
style = TitleProxyStyle(self.style())
self.setStyle(style)
self._titleColor = QtGui.QColor()

@property
def titleColor(self):
return self._titleColor

@titleColor.setter
def titleColor(self, color):
self._titleColor = color
self.update()


class Mywindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(Mywindow, self).__init__(parent)
self.setWindowTitle("Customized style")
self.mdiarea = QtWidgets.QMdiArea()
self.setCentralWidget(self.mdiarea)
self.mdiarea.setWindowTitle("Test")

self.window = QtWidgets.QWidget()
self.window.setMinimumSize(160, 120)

sw = MdiSubWindow()
sw.setWindowTitle("Test")
sw.titleColor = QtGui.QColor("lightgray")
sw.setWidget(self.window)
self.mdiarea.addSubWindow(sw)


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
app.setStyle("Fusion")
view = Mywindow()
view.show()
sys.exit(app.exec_())

enter image description here

关于python - 删除 QMdiSubWindow 的图标和样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56875260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com