PySide - PyQt4 - 在一个表格部件上绘制

3
在下面的代码中,我想在坐标为(4,5)的单元格上绘制一个圆形。我该如何实现?
#! /usr/bin/env python2.7
# -*- coding: utf-8 -*-

import sys

from PySide import QtCore, QtGui

class MainWindow(QtGui.QWidget):
    def __init__(
        self,
        parent = None
    ):
        super(MainWindow, self).__init__(parent)

# General grid
        self.table = QtGui.QTableWidget(self)
        self.nbrow, self.nbcol = 9, 9
        self.table.setRowCount(self.nbrow)
        self.table.setColumnCount(self.nbcol)

# Each cell has dimension 50 pixels x 50 pixels
        for row in range(0, self.nbrow):
            self.table.setRowHeight(row, 50)

            for col in range(0, self.nbcol):
                self.table.setColumnWidth(col, 50)

# Each cell contains one single QTableWidgetItem
        for row in range(0, self.nbrow):
            for col in range(0, self.nbcol):
                item = QtGui.QTableWidgetItem()
                item.setTextAlignment(
                    QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter
                )

                self.table.setItem(row, col, item)

# Header formatting
        font = QtGui.QFont()
        font.setFamily(u"DejaVu Sans")
        font.setPointSize(12)
        self.table.horizontalHeader().setFont(font)
        self.table.verticalHeader().setFont(font)

# Font used
        font = QtGui.QFont()
        font.setFamily(u"DejaVu Sans")
        font.setPointSize(20)
        self.table.setFont(font)

# Global Size
        self.resize(60*9, 60*9 + 20)

# Layout of the table
        layout = QtGui.QGridLayout()
        layout.addWidget(self.table, 0, 0)
        self.setLayout(layout)

# Set the focus in the first cell
        self.table.setFocus()
        self.table.setCurrentCell(0, 0)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    fen = MainWindow()
    fen.show()
    sys.exit(app.exec_())
1个回答

1
我猜你可以像下面的例子一样重新实现paint方法,它捕获右键单击并在相应的坐标上放置一个小圆圈。
#!/usr/bin/python
#-*- coding:utf-8 -*-

from PyQt4.QtCore import *
from PyQt4.QtGui import *


class PaintTable(QTableWidget):
    def __init__(self, parent):
        QTableWidget.__init__(self, parent)
        self.setRowCount(10) 
        self.setColumnCount(10)
        self.center = QPoint(-10,-10)

    def paintEvent(self, event):
        painter = QPainter(self.viewport()) #See: https://dev59.com/vmfWa4cB1Zd3GeqPl_OJ
        painter.drawEllipse(self.center,10,10)
        QTableWidget.paintEvent(self,event)

    def mousePressEvent(self, event):
        if event.buttons() == Qt.RightButton:
            self.center = QPoint(event.pos().x(),  event.pos().y())
            print self.center
            self.viewport().repaint()

        elif event.buttons() == Qt.LeftButton:
            QTableWidget.mousePressEvent(self,event)


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

        self.table = PaintTable(self)
        self.setCentralWidget(self.table)


if __name__ == "__main__":
    import  sys

    app = QApplication(sys.argv)
    main = mainWindow()
    main.show()
    sys.exit(app.exec_())

应用于您的最小工作示例,它将如下所示:
#! /usr/bin/env python2.7
# -*- coding: utf-8 -*-

import sys

#from PyQt4 import QtCore, QtGui 
from PySide import QtCore, QtGui #Just tested it for PyQt4 since I don't have PySide installed...


class PaintTable(QtGui.QTableWidget):
    def __init__(self, parent):
        QtGui.QTableWidget.__init__(self, parent)
        self.center = QtCore.QPoint(-10,-10)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self.viewport()) #See: https://dev59.com/vmfWa4cB1Zd3GeqPl_OJ
        painter.drawEllipse(self.center,10,10)
        QtGui.QTableWidget.paintEvent(self,event)

    def mousePressEvent(self, event):
        if event.buttons() == QtCore.Qt.RightButton:
            self.center = QtCore.QPoint(event.pos().x(),  event.pos().y())
            print self.center
            self.viewport().repaint()

        elif event.buttons() == QtCore.Qt.LeftButton:
            QtGui.QTableWidget.mousePressEvent(self,event)

class MainWindow(PaintTable):
    def __init__(
        self,
        parent = None
    ):
        super(MainWindow, self).__init__(parent)

# General grid
        self.table = PaintTable(self)
        self.nbrow, self.nbcol = 9, 9
        self.table.setRowCount(self.nbrow)
        self.table.setColumnCount(self.nbcol)
        for row in range(0, self.nbrow):
            self.table.setRowHeight(row, 50)

            for col in range(0, self.nbcol):
                self.table.setColumnWidth(col, 50)

# Each cell contains one single QTableWidgetItem
        for row in range(0, self.nbrow):
            for col in range(0, self.nbcol):
                item = QtGui.QTableWidgetItem()
                item.setTextAlignment(
                    QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter
                )

                self.table.setItem(row, col, item)

# Header formatting
        font = QtGui.QFont()
        font.setFamily(u"DejaVu Sans")
        font.setPointSize(12)
        self.table.horizontalHeader().setFont(font)
        self.table.verticalHeader().setFont(font)

# Font used
        font = QtGui.QFont()
        font.setFamily(u"DejaVu Sans")
        font.setPointSize(20)
        self.table.setFont(font)

# Global Size
        self.resize(60*9, 60*9 + 20)

# Layout of the table
        layout = QtGui.QGridLayout()
        layout.addWidget(self.table, 0, 0)
        self.setLayout(layout)

# Set the focus in the first cell
        self.table.setFocus()
        self.table.setCurrentCell(0, 0)



if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    fen = MainWindow()
    fen.show()
    sys.exit(app.exec_())

output


感谢您的建议,但不幸的是,PySide 不同意您的观点:QPainter::begin: 一个绘图设备一次只能被一个画家绘制。 - user1054158
我刚刚在我的Ubuntu系统上安装了python-pyside软件包(版本为1.0.1-1ubuntu0.1),并使用pyside进行了测试,似乎运行得非常好。您能否发布您正在使用的版本以及重现错误的步骤? - student
我正在使用Enthought Python Distribution (EPD)免费版本 - 版本:7.3-2(32位)和PySide 1.1.0。 - user1054158
paintEvent 函数的结尾处添加 painter.end() 有帮助吗?也许这个答案可以帮助:https://dev59.com/KFzUa4cB1Zd3GeqP57hX#7943201 - student

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接