Календарь PyQt - проблемы при попытке окрасить ячейку даты
У меня возникают некоторые проблемы при попытке перекрасить ячейку даты после ее выбора, используя календарь, созданный в QT Designer и преобразованный через pyuic 4.
До сих пор я видел несколько похожих вопросов о перекрашивании ячеек или строк таблиц / древовидных виджетов - но эти примеры проистекают из расширения базового класса QCalendarWidget или Tree до создания экземпляров в коде... тогда как я использую QT Designer с размещенным каландром Виджет конвертируется через Pyuic и создается в преобразованном скрипте Python.
Вот пример моего основного файла окна, где я пытаюсь изменить цвет выбора даты, используя функцию paintCell QCalendarWidget:
import os, sys
from PyQt4 import QtCore, QtGui
from calanderTestWindow import Ui_calanderTestWindow
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.ui = Ui_calanderTestWindow()
self.ui.setupUi(self)
self.conncectSignals()
def conncectSignals(self):
QtCore.QObject.connect(self.ui.testCalander, QtCore.SIGNAL('selectionChanged()'), self.clickDate)
def clickDate(self):
painter = QtGui.QPainter()
painter.setPen(QtGui.QColor(0,255,255))
date = self.ui.testCalander.selectedDate()
cellRect = QtCore.QRect(0,0,10,10)
self.ui.testCalander.paintCell(painter, cellRect, date)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = Main()
window.show()
sys.exit(app.exec_())
и вот преобразованный в puic скрипт Qt Designer:
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_calanderTestWindow(object):
def setupUi(self, calanderTestWindow):
calanderTestWindow.setObjectName(_fromUtf8("calanderTestWindow"))
calanderTestWindow.resize(262, 203)
calanderTestWindow.setWindowTitle(QtGui.QApplication.translate("calanderTestWindow", "Calendar Test Window", None, QtGui.QApplication.UnicodeUTF8))
self.centralwidget = QtGui.QWidget(calanderTestWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.testCalander = QtGui.QCalendarWidget(self.centralwidget)
self.testCalander.setGeometry(QtCore.QRect(0, 0, 256, 155))
self.testCalander.setGridVisible(True)
self.testCalander.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader)
self.testCalander.setNavigationBarVisible(True)
self.testCalander.setObjectName(_fromUtf8("testCalander"))
calanderTestWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(calanderTestWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 262, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
calanderTestWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(calanderTestWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
calanderTestWindow.setStatusBar(self.statusbar)
self.retranslateUi(calanderTestWindow)
QtCore.QMetaObject.connectSlotsByName(calanderTestWindow)
def retranslateUi(self, calanderTestWindow):
pass
Когда я запускаю это, я получаю следующие сообщения журнала, которые в значительной степени говорят мне, что что-то идет не так:
QPainter::setPen: Painter not active
QPainter::save: Painter not active
QPainter::setClipRect: Painter not active
QPainter::brushOrigin: Painter not active
QPainter::setBrushOrigin: Painter not active
QPainter::setBrushOrigin: Painter not active
QPainter::setPen: Painter not active
QPainter::pen: Painter not active
QPainter::save: Painter not active
QPainter::setBackgroundMode: Painter not active
QPainter::setBrush: Painter not active
QPainter::setBrushOrigin: Painter not active
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active
QPainter::drawRects: Painter not active
QPainter::drawRects: Painter not active
QPainter::drawRects: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::restore: Unbalanced save/restore
Я - то, что вы могли бы считать программистом младшего уровня (или меньше) - у меня есть большой опыт работы с Python и немного QT в Autodesk Maya, и я имею опыт работы в Техническом искусстве - но, вероятно, не достаточно фона в ядре Принципы ООП. Очень готов учиться, хотя. Любая помощь приветствуется.
Cheers, D.
1 ответ
Я не знаю, нашли ли вы ответ на этот вопрос когда-либо / пока, но здесь идет. Виджет календаря на самом деле мало что делает для отображения выбранных дат, но больше для выбора дат. Он также ищет класс рисования, который сейчас использует qwidget, я думаю.
Но вы можете повторно реализовать QCalendarWidget и перезаписать вызов paintCell, чтобы показать выбранные вами даты.
from PyQt4 import QtCore, QtGui
class dateCalendar(QtGui.QCalendarWidget)
def __init__(self, parent = None):
super(calendar, self).__init__(parent)
self.color = QtGui.QColor(self.palette().color(QtGui.QPalette.Highlight))
self.color.setAlpha(150)
#self.selectionChanged.connect(self.updateCells)
self.dateList = []
def paintCell(self, painter, rect, date):
#calling original paintCell to draw the actual calendar
QtGui.QCalendarWidget.paintCell(self, painter, rect, date)
#highlight a particular date
if date in self.dateList:
painter.fillRect(rect, self.color)
def selectDates(self, qdatesList):
self.dateList = qdatesList
#this redraws the calendar with your updated date list
self.updateCells()
Хотя теперь вам нужно будет вручную кодировать его в свой виджет вместо того, чтобы использовать его в Qt Designer (если вы не хотите превращать его в плагин)
Надеюсь, это поможет, если вы никогда не решили это.
class widget(QtGui.QWidget):
def __init__(self, parent = None):
super(empty, self).__init__(parent)
self.setGeometry(300, 300, 280, 170)
#no layout
self.cal = calendar(self)
self.but = QtGui.QPushButton("Push", self)
self.but.clicked.connect(self.addDate)
def addDate(self):
self.cal.selectDates([QtCore.QDate(2012,10,8), QtCore.QDate(2012,10,5)])