コントロールとして使用するカスタムウィジェット(QWidgetから継承)を開発しています。ウィジェットのアスペクト比を正方形に修正しながら、垂直方向と水平方向の両方のスペースが許す場合に、レイアウトマネージャーがウィジェットのサイズを変更できるようにするにはどうすればよいですか?
QPainterのビューポートを設定して、中央の正方形の領域にのみ描画するように設定できますが、それでもユーザーは描画された領域のいずれかの側をクリックできます。
すべての状況でウィジェットを正方形に保つ普遍的な方法はないようです。次のいずれかを選択する必要があります。
class MyWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
policy.setHeightForWidth(True)
self.setSizePolicy(policy)
...
def heightForWidth(self, width):
return width
...
class MyWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
...
def resizeEvent(self, e):
setMinimumWidth(height())
...
そのような可能性がある限り、そのようなウィジェットは正方形に保たれます。
他の場合については、あなたが述べたように、実際にビューポートを変更することを検討する必要があります。マウスイベントはそれほど問題にはならないはずです。ウィジェットの中心を見つけ(寸法を2で割る)、min(width, height)
そこから見つけて移動します。座標によってマウスイベントを検証できるはずです。QMouseEvent.accept
イベントが検証に合格し、イベントを使用した場合にのみ、を呼び出すと便利です。
BlaXpirit の方法を使用しますが、以前に使用した別の方法を次に示します。
カスタム ウィジェットをサブクラスresiseEvent()
化すると、要求されたサイズを調整して正方形にし、ウィジェットのサイズを手動で設定できます。
import sys
from PyQt4 import QtCore, QtGui
class CustomWidget(QtGui.QFrame):
def __init__(self, parent=None):
QtGui.QFrame.__init__(self, parent)
# Give the frame a border so that we can see it.
self.setFrameStyle(1)
layout = QtGui.QVBoxLayout()
self.label = QtGui.QLabel('Test')
layout.addWidget(self.label)
self.setLayout(layout)
def resizeEvent(self, event):
# Create a square base size of 10x10 and scale it to the new size
# maintaining aspect ratio.
new_size = QtCore.QSize(10, 10)
new_size.scale(event.size(), QtCore.Qt.KeepAspectRatio)
self.resize(new_size)
class MainWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
layout = QtGui.QVBoxLayout()
self.custom_widget = CustomWidget()
layout.addWidget(self.custom_widget)
self.setLayout(layout)
app = QtGui.QApplication(sys.argv)
window = MainWidget()
window.show()
sys.exit(app.exec_())