Утро, я хочу нарисовать выделенные ячейки одной прямоугольной (Qrect) ячейкой с возможностью расширения формул, как в Excel Идея состоит в том, чтобы нарисовать некоторую ячейку
![enter image description here](https://i.stack.imgur.com/jY3lS.png)
Если пользователь выбрал элемент только с одним прямоугольником, при попытке получить несколько прямоугольников.
Я хотел бы нарисовать один прямоугольник, я попробую делегировать краску, но этот ответ не совпадает с таблицей 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_())