Форум сайта python.su
Здравствуйте.
Необходимо сделать QDateTimeEdit виджет с кнопкой QPushButton для установки некоего дефолтного значения. Причем он должен наследоваться от QDateTimeEdit. В какую сторону смотреть?
Если есть пример, хорошо. Нет, можно и на пальцах. Возможно-ли в контрукторе с минимумом затрат добавить кнопку с последующим исправлением размеров виджета. Или необходима отрисовка низкоуровневыми средствами. Интересует общая концепция создания такого рода виджетов.
Офлайн
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)
Офлайн
Спасибо. Такой вариант подойдёт.
Может ещё кто подскажет, как разместить QToolButton вне наследуемого виджета? Мне-бы принцип понять. Как, к примеру, комбобокс сделать с кнопкой, ибо не всегда есть возможность использовать модифицированный lineedit.
Офлайн
truporezРазместить то можно, просто указываем родителя при создании QToolButton. Но вот на ресайз все равно нужно по особенному реагировать в resizeEvent, т.е. нужно будет наследоваться от комбобокса (например).
Может ещё кто подскажет, как разместить QToolButton вне наследуемого виджета?
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)
Офлайн
Прощу прощения, я неверно выразился. Как пример, необходимо создать такой виджет как на изображении, наследованный от QComboBox.
Прикреплённый файлы: combobtn.png (1,6 KБ)
Офлайн
Но зачем ему быть наследованным от 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)
Офлайн
Да, наследование нужно было для работы всех методов QComboBox. Хотел увидеть как такое делается по QT идеологии. Хотя и python-style тоже ничего. Спасибо.
Офлайн
truporezНаверное примерно как в CustomCombo, только еще нужно будет и paint переопределить и геометрию как-то увеличить, плюс еще какие-то хаки.
Хотел увидеть как такое делается по QT идеологии
Отредактировано reclosedev (Июль 21, 2012 13:55:57)
Офлайн