Как минимум, есть 2 решения:
1. Используйте Qt StyleSheet
Вы должны использовать свойство "background" в QMdiSubWindow: title, чтобы изменить цвет, и чтобы удалить значок, нужно просто передать ему значок с прозрачным цветом
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_())
Как вы можете видеть в моей операционной системе, в середине он имеет белый цвет, который не нужен для окрашивания заголовка подокна, возможно, в другой операционной системе это не создает такой проблемы.
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_())