0

PyQt QCalendarWidget を介して実行中のワークアウトを表示する GUI を作成しました。次のコードは、これらの投稿に基づいています。

paint メソッドを上書きするためにサブクラスを作成しました。これは、paintCell メソッド内に日付がハードコーディングされている場合にうまく機能します。しかし、理想的には、データフレームとして一連の日付/走行距離を返す関数を最初に実行したいと思います。次に、このデータフレームを使用して QCalendarWidget を「設定」します (たとえば、対応する日付のテキストとして走行距離を追加することにより)。

class MyQtApp(trigui.Ui_MainWindow, QtWidgets.QMainWindow):
    def __init__(self):
        super(MyQtApp, self).__init__()
        self.setupUi(self)
        self.Calendar()
        self.df = pd.DataFrame()
        self.qPlan_Create_btn.clicked.connect(self.draw_running_plan)

    def Calendar(self):
        self.cal = CalendarWidget(self.qPlan_Widget)
        self.cal.resize(1700, 800)

    def draw_running_plan(self):
        self.df = pd.DataFrame([[25-05-2021, 10], [27-05-2021, 12]], columns=['Date', 'Distance'])
       #########
       # how can I pass this dataframe to the paintCell

class CalendarWidget(QtWidgets.QCalendarWidget):
    def paintCell(self, painter, rect, date):
        painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
        if date == QtCore.QDate(2021, 5, 15):
            painter.save()
            painter.drawRect(rect)
            painter.setPen(QtGui.QColor(168, 34, 3))
            painter.drawText(rect, QtCore.Qt.AlignHCenter, 'Hello\nWorld')
            painter.drawText(QtCore.QRectF(rect), 
             QtCore.Qt.TextSingleLine|QtCore.Qt.AlignCenter, str(date.day()))

            painter.restore()
        else:
            QtWidgets.QCalendarWidget.paintCell(self, painter, rect, date)

def main():
    import sys

    app = QtWidgets.QApplication(sys.argv)
    qt_app = MyQtApp()
    qt_app.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

どういうわけか、メソッド Calendar を my から呼び出す必要があります__init__。関数 draw_running_plan 内で self.cal = CalendarWidget (self.qPlan_Widget) を設定しようとしましたが、カレンダーが表示されません。参考までに、self.qPlan_Widget は、QtDesigner で作成した単純なウィジェット/コンテナーであり、Calendar メソッドで CalendarWidget になるように初期化します。簡単に言うと、CalendarWidget を初期化した後、中間関数の結果で更新するにはどうすればよいでしょうか?

編集:PyQtではなくPySide2であるタグに関する私の間違い

4

1 に答える 1