【问题标题】:PySide - PyQt4 - Draw on one table widgetPySide - PyQt4 - 在一个表格小部件上绘制
【发布时间】:2013-03-19 15:49:01
【问题描述】:

在下面的代码中,我想在坐标 (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_())

【问题讨论】:

    标签: python pyqt4 pyside


    【解决方案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: http://stackoverflow.com/questions/12226930/overriding-qpaintevents-in-pyqt
            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: http://stackoverflow.com/questions/12226930/overriding-qpaintevents-in-pyqt
            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_())
    

    【讨论】:

    • 感谢您的提议,但不幸的是,PySide 不同意 QPainter::begin: A paint device can only be painted by one painter at a time.
    • 好吧,我刚刚在我的 ubuntu 机器上安装了 python-pyside 包(版本 1.0.1-1ubuntu0.1),并用 pyside 对其进行了测试,它似乎工作得很好。您能否发布您正在使用的版本以及重现错误的步骤?
    • 我正在使用 Enthought Python Distribution (EPD) 免费版 - 版本:7.3-2(32 位)和 PySide 1.1.0。
    • paintEvent 函数的末尾添加painter.end() 是否有帮助?也许这个答案确实有帮助:stackoverflow.com/a/7943201/406686
    猜你喜欢
    • 2013-03-08
    • 2017-01-28
    • 2018-01-20
    • 2018-03-08
    • 1970-01-01
    • 2023-02-21
    • 2017-01-30
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多