Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2012 21:24:49

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt: QDateTimeEdit+QPushButton

Здравствуйте.

Необходимо сделать QDateTimeEdit виджет с кнопкой QPushButton для установки некоего дефолтного значения. Причем он должен наследоваться от QDateTimeEdit. В какую сторону смотреть?

Если есть пример, хорошо. Нет, можно и на пальцах. Возможно-ли в контрукторе с минимумом затрат добавить кнопку с последующим исправлением размеров виджета. Или необходима отрисовка низкоуровневыми средствами. Интересует общая концепция создания такого рода виджетов.



Офлайн

#2 Июль 19, 2012 23:01:59

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt: QDateTimeEdit+QPushButton

http://labs.qt.nokia.com/2007/06/06/lineedit-with-a-clear-button/

Там описано как сделать LineEdit с кнопкой QToolButton (можно и с QPushButton).
В QAbstractSpinbox (QDateTimeEdit) есть метод setLineEdit.

В своем LineEditWithButton можно сделать доступной кнопку или только сигналы от нее.
В наследнике QDateTimeEdit нужно будет создать LineEditWithButton, установить его и подписаться на сигналы от кнопки.

Отредактировано reclosedev (Июль 19, 2012 23:03:02)

Офлайн

#3 Июль 20, 2012 10:48:02

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt: QDateTimeEdit+QPushButton

Спасибо. Такой вариант подойдёт.

Может ещё кто подскажет, как разместить QToolButton вне наследуемого виджета? Мне-бы принцип понять. Как, к примеру, комбобокс сделать с кнопкой, ибо не всегда есть возможность использовать модифицированный lineedit.



Офлайн

#4 Июль 20, 2012 13:23:27

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt: QDateTimeEdit+QPushButton

truporez
Может ещё кто подскажет, как разместить QToolButton вне наследуемого виджета?
Разместить то можно, просто указываем родителя при создании QToolButton. Но вот на ресайз все равно нужно по особенному реагировать в resizeEvent, т.е. нужно будет наследоваться от комбобокса (например).
Но это не мешает передавать кнопку созданную снаружи.

Примерно так:
from PyQt4 import QtCore, QtGui
 
 
class CustomCombo(QtGui.QComboBox):
    def __init__(self, parent=None, button=None):
        QtGui.QComboBox.__init__(self, parent)
        self.button = None
        if button is not None:
            self.set_button(button)
         
    def resizeEvent(self, event):
         if self.button is None:
            return
         sz = self.button.sizeHint()
         frame_width = self.style().pixelMetric(QtGui.QStyle.PM_ComboBoxFrameWidth)
         self.button.move(self.rect().right() - frame_width - sz.width() - 17, 
                         (self.rect().bottom() + 1 - sz.height())/2)
 
    def set_button(self, button):
        self.button = button
        button.setParent(self)
        frame_width = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
        msz = self.minimumSizeHint()
        self.setMinimumSize(
            max(msz.width(), button.sizeHint().width() + frame_width * 2 + 2),
            max(msz.height(), button.sizeHint().height() + frame_width * 2 + 2)
        )
 
 
class MainWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QVBoxLayout()
        combo = CustomCombo(parent=self, button=QtGui.QPushButton('test'))
        # or combo.set_button(self.some_existing_button)
        combo.addItems(map(unicode, range(5)))
        layout.addWidget(combo)
        self.setLayout(layout)
         
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    widget = MainWidget()
    widget.resize(640, 480)
    widget.show()
    sys.exit(app.exec_())
тут многое не учитывается, но, думаю, принцип понятен.

Отредактировано reclosedev (Июль 20, 2012 13:24:15)

Офлайн

#5 Июль 20, 2012 14:27:02

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt: QDateTimeEdit+QPushButton

Прощу прощения, я неверно выразился. Как пример, необходимо создать такой виджет как на изображении, наследованный от QComboBox.



Прикреплённый файлы:
attachment combobtn.png (1,6 KБ)

Офлайн

#6 Июль 20, 2012 14:53:10

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt: QDateTimeEdit+QPushButton

Но зачем ему быть наследованным от QComboBox? Проще ведь сделать виджет с QHBoxLayout.
Или где-то проверяется его тип и нужно чтобы доступ к элементам был? Можно и __getattr__ переопределить на крайний случай.

class CustomWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QHBoxLayout()
        self.button = QtGui.QPushButton(maximumWidth=100)
        self.combo = QtGui.QComboBox()
        layout.addWidget(self.combo)
        layout.addWidget(self.button)
        self.setLayout(layout)
    def __getattr__(self, attr):
        return getattr(self.combo, attr)

Офлайн

#7 Июль 21, 2012 13:13:54

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQt: QDateTimeEdit+QPushButton

Да, наследование нужно было для работы всех методов QComboBox. Хотел увидеть как такое делается по QT идеологии. Хотя и python-style тоже ничего. Спасибо.



Офлайн

#8 Июль 21, 2012 13:51:41

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

PyQt: QDateTimeEdit+QPushButton

truporez
Хотел увидеть как такое делается по QT идеологии
Наверное примерно как в CustomCombo, только еще нужно будет и paint переопределить и геометрию как-то увеличить, плюс еще какие-то хаки.

Проще сделать составной виджет и выставить наружу необходимый api (вручную или с магией Питона). Или дать доступ к компонентам через атрибуты, гетеры или property и передавать их в функции, которые требуют конкретные интерфейсы (комбобоксы и т.п.).

P.S.
http://stackoverflow.com/questions/991477/qt-how-to-subclass-a-widget-to-add-more-elements-to-it

Отредактировано reclosedev (Июль 21, 2012 13:55:57)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version