Как нарисовать прямоугольник выделения в QtableWidget на сетке? - PullRequest
0 голосов
/ 31 октября 2019

Утро, я хочу нарисовать выделенные ячейки одной прямоугольной (Qrect) ячейкой с возможностью расширения формул, как в Excel Идея состоит в том, чтобы нарисовать некоторую ячейку

enter image description here

Если пользователь выбрал элемент только с одним прямоугольником, при попытке получить несколько прямоугольников.

Я хотел бы нарисовать один прямоугольник, я попробую делегировать краску, но этот ответ не совпадает с таблицей Excel.

Спасибо за вашу помощь. Некоторые коды для глаз:

from PyQt5 import QtCore, QtGui,QtWidgets,QtPrintSupport
from PyQt5.QtWidgets import*
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import string

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
      MainWindow.setObjectName("MainWindow")
      MainWindow.resize(800, 600)
      self.centralwidget = QtWidgets.QWidget(MainWindow)
      self.centralwidget.setObjectName("centralwidget")
      self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
      self.verticalLayout.setObjectName("verticalLayout")
      self.horizontalLayout = QtWidgets.QHBoxLayout()
      self.horizontalLayout.setObjectName("horizontalLayout")
      self.label = QtWidgets.QLabel(self.centralwidget)
      self.label.setObjectName("label")
      self.horizontalLayout.addWidget(self.label)
      self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
      self.lineEdit.setObjectName("lineEdit")
      self.horizontalLayout.addWidget(self.lineEdit)
      self.verticalLayout.addLayout(self.horizontalLayout)
      MainWindow.setCentralWidget(self.centralwidget)
      self.menubar = QtWidgets.QMenuBar(MainWindow)
      self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
      self.menubar.setObjectName("menubar")
      MainWindow.setMenuBar(self.menubar)

      self.retranslateUi(MainWindow)
      QtCore.QMetaObject.connectSlotsByName(MainWindow)

   def retranslateUi(self, MainWindow):
      _translate = QtCore.QCoreApplication.translate
      MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
      self.label.setText(_translate("MainWindow", "FX"))


class fusionassurf(QMainWindow):
   def __init__(self):
      super(fusionassurf,self).__init__()
      self.ui=Ui_MainWindow()
      self.ui.setupUi(self)
      self.ui.tableWidget=Spreadsheet(self)
      self.ui.verticalLayout.addWidget(self.ui.tableWidget)
      self.ui.tableWidget.cellClicked.connect(self.onClickItem)
      self.ui.tableWidget.cellActivated.connect(self.onClickItem)
   def onClickItem(self):
     # return value of formule in QLineEdit
      pass


class Spreadsheet(QTableWidget):
   def __init__(self, parent=None):
      super().__init__(parent)  
      self.setRowCount(20)
      self.setColumnCount(26)
      self.cells = {}
      header=[x for x in string.ascii_uppercase]
      self.setHorizontalHeaderLabels(header)
      self.setItemDelegate(SpreadSheetDelegate(self))
      self.setSelectionMode(self.ContiguousSelection)
      # test
      self.autocalcul=True
      #self.setItemPrototype(SpreadSheetItem('', self))
      for i in range(0, self.rowCount()):
         for j in range(0, self.columnCount()):
            cell = SpreadSheetItem("")
            self.setItem(i, j, cell)



class SpreadSheetDelegate(QItemDelegate):
   def __init__(self, parent=None):
      super(SpreadSheetDelegate, self).__init__(parent)
      self.selectionmodel = parent.selectionModel()

   def createEditor(self, parent, styleOption, index):
      editor = QLineEdit(parent)
      editor.editingFinished.connect(self.commitAndCloseEditor)
      return editor

   def commitAndCloseEditor(self):
      editor = self.sender()
      self.commitData.emit(editor)
      self.closeEditor.emit(editor, QItemDelegate.NoHint)

   def setEditorData(self, editor, index):
      editor.setText(index.model().data(index, Qt.EditRole))

   def setModelData(self, editor, model, index):
      model.setData(index, editor.text())
   def paint(self, painter, option, index):
      super(SpreadSheetDelegate, self).paint(painter, option, index)
      if option.state & QStyle.State_Selected:
         value = index.data(Qt.DisplayRole)
         if index.isValid():
            text = str(value)
            painter.drawText(option.rect, Qt.AlignLeft, text)
            pass            

         pen=QPen(Qt.darkGreen,3, Qt.SolidLine,join=Qt.MiterJoin)

         painter.setPen(pen)
     #painter.translate( option.rect.topLeft() )
     #painter.setPoint(Qpo)
     #painter.setBrush(QBrush(QColor("#3399FF"))) #co
     #painter.save()
     #painter.setBrush(option.palette.Background())
         painter.setRenderHint(painter.Antialiasing)
         painter.setBrush(QBrush(Qt.white)) 
         painter.drawRect(option.rect.x(),option.rect.y(),option.rect.width(),option.rect.height())
         painter.setBrush(Qt.darkGreen)
         if self.selectionmodel.currentIndex()==index:
             painter.drawRect(option.rect.x()+option.rect.width()-3,option.rect.y()+option.rect.height()-2,5,5)
        #painter.end()
         painter.save()
         painter.viewport()   




class SpreadSheetItem(QTableWidgetItem):
   def __init__(self, text=None):
      if text is not None:
         super(SpreadSheetItem, self).__init__(text)
      else:
         super(SpreadSheetItem, self).__init__()

   def formula(self):
      return super(SpreadSheetItem, self).data(Qt.DisplayRole)

   def data(self, role):
      if role in (Qt.EditRole, Qt.StatusTipRole,Qt.DisplayRole):
         return self.formula()
      return super(SpreadSheetItem, self).data(role)

   def setData(self, role, value):
      super(SpreadSheetItem, self).setData(role, value)
      if self.tableWidget():
         self.tableWidget().viewport().update()






if __name__ == "__main__":

   import sys

   app = QtWidgets.QApplication(sys.argv)
   window =fusionassurf()
   window.show() 
   sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...