проблемы, пытающиеся покрасить ячейку даты - PullRequest
1 голос
/ 07 ноября 2011

У меня возникают некоторые проблемы при попытке перекрасить ячейку даты после ее выбора, используя календарь, созданный в QT Designer и преобразованный с помощью pyuic 4.

До сих пор я видел несколько похожих вопросов о-краска ячеек или строк таблиц / древовидных виджетов - но эти примеры проистекают из расширения базового класса QCalendarWidget или Tree до создания экземпляров в коде ... тогда как я использую QT Designer, размещенный виджет календаря, преобразованный через pyuic и созданный в преобразованном питонеscript.

Вот пример моего основного файла окна, где я пытаюсь изменить цвет выделения даты с помощью функции 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_())

, а вотПреобразованный скрипт put 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

I 'м, что вы могли бы считать кодером младшего уровня (или меньше) - у меня есть большой опыт работы с Python иНемного QT в Autodesk Maya и имеет опыт работы в области технического искусства, но, вероятно, недостаточно основ в основных принципах ООП.Очень хочу учиться, хотя.

1 Ответ

2 голосов
/ 10 октября 2012

Я не знаю, нашли ли вы ответ для этого когда-либо / пока, но здесь идет. Виджет календаря на самом деле мало что делает для отображения выбранных дат, но больше для выбора дат.Он также ищет класс рисования, который сейчас использует 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)])
...