【问题标题】:issues trying to color date cell尝试为日期单元格着色的问题
【发布时间】:2011-12-23 06:08:49
【问题描述】:

我在尝试使用在 QT Designer 中创建并通过 pyuic 4 转换的日历选择日期单元格后重新着色日期单元格时遇到了一些问题。

到目前为止,我已经看到一些关于重新着色单元格或表格/树小部件行的类似问题 - 但这些示例源于在代码中实例化之前扩展基本 QCalendarWidget 或 Tree 小部件类......而我使用的是 QT设计师放置了通过pyuic转换的日历小部件,并在转换后的python脚本中实例化。

这是我的窗口主文件的示例,我尝试使用 QCalendarWidget 的 paintCell 函数更改日期选择的颜色:

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 方面拥有丰富的经验,并且在 Autodesk Maya 内部有一点 QT,并且有技术艺术方面的背景-但可能还不够核心 OOP 原则的背景。不过非常愿意学习。

【问题讨论】:

    标签: python pyqt pyqt4 qpainter qcalendarwidget


    【解决方案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 设计器中使用它(除非您想将其变成插件)

    如果您从未解决它,希望对您有所帮助。

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

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 1970-01-01
      • 2020-05-07
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多