第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在 QCalendarWidget 中禁用其他月份

如何在 QCalendarWidget 中禁用其他月份

梵蒂岡之花 2021-09-14 10:47:06
我的目標(biāo)是禁用用戶可以單擊 aQCalendarWidget中非當(dāng)前月份的日期,因此我將小部件子類化以執(zhí)行此操作。到目前為止,我可以讓那些日子根本不渲染任何文本(很棒)。這是代碼:class QCustomCalendar(QCalendarWidget):    """Create my own Calendar with my own options."""    def __init__(self, parent=None):        """Initializing functions"""        QCalendarWidget.__init__(self, parent)        self.setEnabled(True)        self.setGeometry(QRect(0, 0, 320, 250))        self.setGridVisible(False)        self.setHorizontalHeaderFormat(QCalendarWidget.SingleLetterDayNames)        self.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader)        self.setNavigationBarVisible(True)        self.setDateEditEnabled(True)        self.setObjectName("calendarWidget")    def paintCell(self, painter, rect, date):        """Sub-class this and repaint the cells"""        # Render only this-month days        month = "{0}-{1}".format(str(self.yearShown()), str(self.monthShown()).zfill(2))        day = str(date.toPython())        if not day.startswith(month):            return        QCalendarWidget.paintCell(self, painter, rect, date)但是,如果我單擊未渲染的一天,它仍然會(huì)計(jì)數(shù)并觸發(fā)clicked事件。示例:我對(duì)一個(gè)紅色方塊進(jìn)行了 photoshop,點(diǎn)擊它,它會(huì)選擇 6 月 4 日(即使我們?cè)谄聊唤貓D中是在 5 月)。我如何禁用那些日子不被選擇?我嘗試setDateRange了currentPageChanged事件,但它沒(méi)有按預(yù)期工作:def __init__(self, parent=None):    # some code    self.currentPageChanged.connect(self.store_current_month)    self.clicked.connect(self.calendar_itemchosen)def store_current_month(self):    self.CURRENT_MONTH = "{0}-{1}".format(str(self.yearShown()), str(self.monthShown()).zfill(2))def calendar_itemchosen(self):    day = str(self.selectedDate().toPython())    print(day)    if day.startswith(self.CURRENT_MONTH):        selection = self.selectedDate()        # some code        self.close()用這個(gè)代碼點(diǎn)擊那個(gè)紅色方塊的結(jié)果是:2018-062018-06-04所以我猜currentPageChanged當(dāng)您選擇另一個(gè)月份的日期時(shí),Qt 首先會(huì)觸發(fā)該事件。setDateRange將不起作用,因?yàn)槿绻姨砑铀詫⑦x擇限制在本月,那么日歷頂部的“轉(zhuǎn)到下個(gè)月或上個(gè)月”按鈕將不起作用,我需要用戶能夠更改月份. 我只是不想讓日歷顯示不屬于這個(gè)月頁(yè)面的日子。
查看完整描述

1 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

一種解決方案是過(guò)濾 QCalendarWidget 內(nèi)部具有的 QTableView 的 mousePressEvent 事件。為此,我們使用事件過(guò)濾器:


from PyQt5 import QtCore, QtWidgets


class CalendarWidget(QtWidgets.QCalendarWidget):

    def __init__(self, parent=None):

        super(CalendarWidget, self).__init__(parent, gridVisible=False,

            horizontalHeaderFormat=QtWidgets.QCalendarWidget.SingleLetterDayNames,

            verticalHeaderFormat=QtWidgets.QCalendarWidget.NoVerticalHeader,

            navigationBarVisible=True,

            dateEditEnabled=True)       

        self.setEnabled(True)

        self.setGeometry(QtCore.QRect(0, 0, 320, 250))

        self.clicked.connect(print)


        self.table_view = self.findChild(QtWidgets.QTableView, "qt_calendar_calendarview")

        self.table_view.viewport().installEventFilter(self)

        self.setFirstDayOfWeek(QtCore.Qt.Monday)


    def referenceDate(self):

        refDay = 1

        while refDay <= 31:

            refDate = QtCore.QDate(self.yearShown(), self.monthShown(), refDay)

            if refDate.isValid(): return refDate

            refDay += 1

        return QtCore.QDate()


    def columnForDayOfWeek(self, day):

        m_firstColumn = 1 if self.verticalHeaderFormat() != QtWidgets.QCalendarWidget.NoVerticalHeader else 0

        if day < 1 or day > 7: return -1

        column = day - int(self.firstDayOfWeek())

        if column < 0:

            column += 7

        return column + m_firstColumn


    def columnForFirstOfMonth(self, date):

        return (self.columnForDayOfWeek(date.dayOfWeek()) - (date.day() % 7) + 8) % 7


    def dateForCell(self, row, column):

        m_firstRow = 1 if self.horizontalHeaderFormat() != QtWidgets.QCalendarWidget.NoHorizontalHeader else 0

        m_firstColumn = 1 if self.verticalHeaderFormat() != QtWidgets.QCalendarWidget.NoVerticalHeader else 0

        rowCount = 6

        columnCount = 7

        if row < m_firstRow or row > (m_firstRow + rowCount -1) or column < m_firstColumn or column > (m_firstColumn + columnCount -1):

            return QtCore.QDate()

        refDate = self.referenceDate()

        if not refDate.isValid():

            return QtCore.QDate()

        columnForFirstOfShownMonth = self.columnForFirstOfMonth(refDate)

        if (columnForFirstOfShownMonth - m_firstColumn) < 1:

            row -= 1

        requestedDay = 7*(row - m_firstRow) +  column  - columnForFirstOfShownMonth - refDate.day() + 1

        return refDate.addDays(requestedDay)


    def eventFilter(self, obj, event):

        if obj is self.table_view.viewport() and event.type() == QtCore.QEvent.MouseButtonPress:    

            ix = self.table_view.indexAt(event.pos())

            date = self.dateForCell(ix.row(), ix.column())

            d_start = QtCore.QDate(self.yearShown(), self.monthShown(), 1)

            d_end = QtCore.QDate(self.yearShown(), self.monthShown(), d_start.daysInMonth())

            if d_start > date or date > d_end:

                return True

        return super(CalendarWidget, self).eventFilter(obj, event)


    def paintCell(self, painter, rect, date):

        d_start = QtCore.QDate(self.yearShown(), self.monthShown(), 1)

        d_end = QtCore.QDate(self.yearShown(), self.monthShown(), d_start.daysInMonth())

        if d_start <= date <= d_end:

            super(CalendarWidget, self).paintCell(painter, rect, date)


if __name__ == '__main__':

    import sys

    app = QtWidgets.QApplication(sys.argv)

    w = CalendarWidget()

    w.show()

    sys.exit(app.exec_())



查看完整回答
反對(duì) 回復(fù) 2021-09-14
  • 1 回答
  • 0 關(guān)注
  • 427 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)