我正试图在PyQt5中画出法国的国旗。
环顾四周后,我发现了渐变,但在与它们玩了一下后,它似乎并不像我需要的那样。我可以在正确的方向上获得正确的颜色但是它们不会像在旗帜中一样变得坚固到停止点。这就是我试过的:
import sys
from PyQt5.QtWidgets import (QApplication, QFrame, QWidget)
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.square = QFrame(self)
self.square.setGeometry(0, 0, 400, 400)
self.square.setStyleSheet("QFrame {background: qlineargradient( x1:0 y1:0, x2:1 y2: 0, stop:0 blue, stop: 0.33 white, stop:0.66 red);}}")
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())
为了能够成功绘制这个标志,我需要什么?
答案 0 :(得分:2)
这是一个重新实现paintEvent
:
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
class FlagWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(FlagWidget, self).__init__(parent)
def paintEvent(self, event):
s = self.size()
qp = QtGui.QPainter()
qp.begin(self)
# Using antialiasing (this shape is simple so you can set it to False)
qp.setRenderHint(QtGui.QPainter.Antialiasing, True)
# Here I'm saying that no border should exist in the rectangles
qp.setPen(QtCore.Qt.NoPen)
# Setting the brush (color or gradient for each rectangle)
qp.setBrush(QtGui.QColor("blue"))
# Drawing the rectangle with arguments coordinate X, Y, size X, Y
qp.drawRect(0, 0, int(s.width()/3), s.height())
qp.setBrush(QtGui.QColor("white"))
qp.drawRect(int(s.width()/3), 0, int(s.width()/3), s.height())
qp.setBrush(QtGui.QColor("red"))
qp.drawRect(int(s.width()/3)*2, 0, int(s.width()/3), s.height())
qp.end()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
main = FlagWidget()
main.show()
sys.exit(app.exec_())
这导致以下结果:
请注意,窗口的大小可能无法完全被3整除,因此最后可能会有2或3个空像素。
要解决这个空白空间问题,你可以在最后一个矩形的图形中使用类似的东西来延长最后一个条纹:
qp.setBrush(QtGui.QColor("red"))
qp.drawRect(int(s.width()/3)*2, 0, s.width() - int(s.width()/3)*2, s.height())