用 Pyside 绘制填充椭圆

Painting filled ellipse with Pyside

我正在尝试在 pyside 中绘制一个纯色椭圆,但我在外面发现了一条意想不到的黑线,而且我也没有得到看起来是光滑圆形的东西?有些颜色也没有显示。

我做错了什么?

import sys
from PySide import QtGui, QtCore

class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.resize(200, 50)
        self.initUI()

    def initUI(self):
        self.ui_list = QtGui.QComboBox()
        grid = QtGui.QVBoxLayout()
        grid.addWidget(self.ui_list)
        self.setLayout(grid)
        self.populate_list()

    def populate_list(self):
        colors = {
            'White': QtCore.Qt.white,  
            'Black': QtCore.Qt.black,  
            'Red': QtCore.Qt.red,
            'Green': QtCore.Qt.green,   
            'Blue': QtCore.Qt.blue,
            'Cyan': QtCore.Qt.cyan,
            'Magenta': QtCore.Qt.magenta,
            'Yellow': QtCore.Qt.yellow, 
            'Gray': QtCore.Qt.gray,
            'Orange': QtGui.QColor(255,128,0)
        }
        px = QtGui.QPixmap(12,12)

        for key, val in sorted(colors.items()):
            px.fill(QtCore.Qt.transparent)
            painter = QtGui.QPainter(px)
            painter.setBrush(QtGui.QColor(val))
            painter.drawEllipse(0,0,12,12)
            self.ui_list.addItem(QtGui.QIcon(px), key) 

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

你必须使用更大的QPixmap,此外你必须调用painter.end()来表明你必须完成绘画:

class Example(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Example, self).__init__(parent)
        self.resize(200, 50)
        self.initUI()

    def initUI(self):
        self.ui_list = QtGui.QComboBox()
        grid = QtGui.QVBoxLayout()
        grid.addWidget(self.ui_list)
        self.setLayout(grid)
        self.populate_list()

    def populate_list(self):
        colors = {
            'White': QtCore.Qt.white,  
            'Black': QtCore.Qt.black,  
            'Red': QtCore.Qt.red,
            'Green': QtCore.Qt.green,   
            'Blue': QtCore.Qt.blue,
            'Cyan': QtCore.Qt.cyan,
            'Magenta': QtCore.Qt.magenta,
            'Yellow': QtCore.Qt.yellow, 
            'Gray': QtCore.Qt.gray,
            'Orange': QtGui.QColor(255,128,0)
        }
        px = QtGui.QPixmap(640,640)

        for key, val in sorted(colors.items()):
            px.fill(QtCore.Qt.transparent)
            painter = QtGui.QPainter(px)
            painter.setBrush(QtGui.QColor(val))
            painter.drawEllipse(px.rect())
            painter.end()
            self.ui_list.addItem(QtGui.QIcon(px), key) 

仅查看已批准的答案,在我看来轮廓是黑色的,设置较大的像素图会使问题不那么明显。我最好改为设置描边颜色。此外,如果您明确打开抗锯齿功能,则无需为了获得更好看的圆圈而增大像素图。

...

for key, val in sorted(colors.items()):
    # a small pixmap size
    size = 32
    px = QtGui.QPixmap(size,size)
    px.fill(QtCore.Qt.transparent)
    painter = QtGui.QPainter(px)
    # turn on Antialiasing
    painter.setRenderHints(QtGui.QPainter.Antialiasing, True)
    # set the brush and pen to the same color
    painter.setBrush(QtGui.QColor(val))
    painter.setPen(QtGui.QColor(val))
    painter.drawEllipse(px.rect())
    painter.end()
    self.ui_list.addItem(QtGui.QIcon(px), key)