Найти - Пользователи
Полная версия: PyQt: QDateTimeEdit+QPushButton
Начало » GUI » PyQt: QDateTimeEdit+QPushButton
1
truporez
Здравствуйте.

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

Если есть пример, хорошо. Нет, можно и на пальцах. Возможно-ли в контрукторе с минимумом затрат добавить кнопку с последующим исправлением размеров виджета. Или необходима отрисовка низкоуровневыми средствами. Интересует общая концепция создания такого рода виджетов.
reclosedev
http://labs.qt.nokia.com/2007/06/06/lineedit-with-a-clear-button/

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

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

Может ещё кто подскажет, как разместить QToolButton вне наследуемого виджета? Мне-бы принцип понять. Как, к примеру, комбобокс сделать с кнопкой, ибо не всегда есть возможность использовать модифицированный lineedit.
reclosedev
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_())
тут многое не учитывается, но, думаю, принцип понятен.
truporez
Прощу прощения, я неверно выразился. Как пример, необходимо создать такой виджет как на изображении, наследованный от QComboBox.
reclosedev
Но зачем ему быть наследованным от 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)
truporez
Да, наследование нужно было для работы всех методов QComboBox. Хотел увидеть как такое делается по QT идеологии. Хотя и python-style тоже ничего. Спасибо.
reclosedev
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB