проблемы, пытающиеся окрасить ячейку даты

1

У меня возникают некоторые проблемы при попытке перекрасить ячейку даты после ее выбора, используя календарь, созданный в 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, и у меня есть опыт работы в Техническом искусстве - но, вероятно, недостаточно основ в ядре Принципы ООП. Очень готов учиться, хотя.

Теги:
pyqt4
pyqt
qpainter

1 ответ

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)])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню