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_())
тут многое не учитывается, но, думаю, принцип понятен.