Комо listar correctamente Лос виджеты dentro de un QLayout

Estimados,
Vengo вносят довод "против" ustedes un problema que me esta molestando actualmente. Estoy tratando de crear un calendario personalizado en Qt, пьедестал que el QCalendarWidget никакой puede сер modificado ni estilizado, estoy haciendo el propio.
El problema es cuando intento conectar los botones de fecha. Принципал Para tratar de obtener el boton precionado intento listarlos desde el contendor de ellos que es un QGirdLayout, pero al hacerlo siempre я средство импорта греха виджета retorna el mismo la posicion de este.

Adjunto el codigo e imagen de consola.

import calendar
import sys
import time

from PyQt4.QtCore import QSize
from PyQt4.QtGui import QApplication
from PyQt4.QtGui import QGridLayout
from PyQt4.QtGui import QPushButton
from PyQt4.QtGui import QWidget


class DayButton(QPushButton):
    def __init__(self, day):
        QPushButton.__init__(self)
        self.setText(str(day))
        self.setCheckable(True)
        self.setFixedSize(QSize(40, 40))


class Calendar(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.today = time.strftime("%x").split("/")

        self.__grid = QGridLayout()
        self.__grid.setSpacing(4)
        self.setCalendar()

        self.setLayout(self.__grid)

    def setCalendar(self):
        selectedDate = calendar.monthrange(int(self.today[2]), int(self.today[0]))

        counter, day = 0, 1
        for i in range(6):
            for j in range(7):
                if counter < selectedDate[0] or day > selectedDate[1]:
                    counter += 1
                    continue
                self.number = DayButton(str(day))
                self.number.released.connect(self.checkChecked)
                self.__grid.addWidget(self.number, i, j)
                day += 1

    def checkChecked(self):
        for item in range(self.__grid.count()):
            print self.__grid.itemAt(item)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    main = Calendar()
    main.show()

    sys.exit(app.exec_())


Комо se наблюдает, siempre retorna el mismo objeto, el cual ni siquiera es el tipo de widget que estoy agregando.

consola

0
задан 26.01.2017, 15:51
2 ответа

Чтобы заносить в список все статьи одного QGridLayout ты можешь создавать генератор, чтобы повторять на них используя QGridLayout.itemAt(int index).widget().

В твой случай ты можешь преобразовывать mГ©todo checkChecked из следующей формы:

def checkChecked(self):
    items = (self.__grid.itemAt(item).widget() for item in range(self.__grid.count()))
    for item in items:
        print item

С этим мы получаем следующий вывод тип:

< main .DayButton object at 0x00000261B3836168>
< main .DayButton object at 0x00000261B3836AF8>
< main .DayButton object at 0x00000261B3836C18>
< main .DayButton object at 0x00000261B3836438>
< main .DayButton object at 0x00000261B3833708>
< main .DayButton object at 0x00000261B38333A8>
< main .DayButton object at 0x00000261B3833678>
< main .DayButton object at 0x00000261B38338B8>
< main .DayButton object at 0x00000261B3833E58>
< main .DayButton object at 0x00000261B3833948>
< main .DayButton object at 0x00000261B3833798>
< main .DayButton object at 0x00000261B3833CA8>
< main .DayButton object at 0x00000261B38334C8>
< main .DayButton object at 0x00000261B38335E8>
< main .DayButton object at 0x00000261B3833438>
< main .DayButton object at 0x00000261B3833558>
< main .DayButton object at 0x00000261B3833D38>
< main .DayButton object at 0x00000261B3833828>
< main .DayButton object at 0x00000261B3833B88>
< main .DayButton object at 0x00000261B3833EE8>
< main .DayButton object at 0x00000261B3833F78>
< main .DayButton object at 0x00000261B3833DC8>
< main .DayButton object at 0x00000261B3833AF8>
< main .DayButton object at 0x00000261B38339D8>
< main .DayButton object at 0x00000261B38331F8>
< main .DayButton object at 0x00000261B3833168>
< main .DayButton object at 0x00000261B3833288>
< main .DayButton object at 0x00000261B3833048>
< main .DayButton object at 0x00000261B38330D8>
< main .DayButton object at 0x00000261B382E288>

ты Можешь использовать это, чтобы изменять объекты (в твоем случае кнопки), например, следующий mГ©todo меняет текст всех кнопок на S:

def checkChecked(self):
    items = (self.__grid.itemAt(item).widget() for item in range(self.__grid.count()))
    for item in items:
        item.setText('S')
1
ответ дан 24.11.2019, 11:26
  • 1
    Спасибо за твою помощь, я боролся с этим он делает dí эксперт :) funcionó верно. – Christopher Vivar Vivar 27.01.2017, 22:20

Если ты хочешь получить, что на кнопку нажали, не необходимо использовать gridlayout, элегантная форма состоит в том, чтобы использовать ее funciГіn sender(), которые возвращают объект, который выразил ее seГ±al.

def checkChecked(self):
    obj = self.sender()
    print obj.text()

CГіdigo завершил:

import calendar
import sys
import time

from PyQt4.QtCore import QSize
from PyQt4.QtGui import QApplication
from PyQt4.QtGui import QGridLayout
from PyQt4.QtGui import QPushButton
from PyQt4.QtGui import QWidget


class DayButton(QPushButton):
    def __init__(self, day):
        QPushButton.__init__(self)
        self.setText(str(day))
        self.setCheckable(True)
        self.setFixedSize(QSize(40, 40))


class Calendar(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.today = time.strftime("%x").split("/")

        self.__grid = QGridLayout()
        self.__grid.setSpacing(4)
        self.setCalendar()

        self.setLayout(self.__grid)

    def setCalendar(self):
        selectedDate = calendar.monthrange(int(self.today[2]), int(self.today[0]))

        counter, day = 0, 1
        for i in range(6):
            for j in range(7):
                if counter < selectedDate[0] or day > selectedDate[1]:
                    counter += 1
                    continue
                self.number = DayButton(str(day))
                self.number.released.connect(self.checkChecked)
                self.__grid.addWidget(self.number, i, j)
                day += 1

    def checkChecked(self):
        obj = self.sender()
        print obj.text()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Calendar()
    w.show()
    sys.exit(app.exec_())
1
ответ дан 24.11.2019, 11:26
  • 1
    Ответ - ú til, но я нуждаюсь в том, чтобы получить объекты внутри чтобы работать с каждым из них ввиду comprobació n, который я должен делать. Равный с sender я могу работать в другой необходимости, которая приходила :) спасибо за вклад :) – Christopher Vivar Vivar 27.01.2017, 22:30