4

そのため、フレームのないQDialogがあり、クリックしてドラッグするだけで移動できるようにしたいと考えています。以下のコードを考えると、ダイアログをドラッグすると、常にダイアログの左上(0,0)がマウスにスナップします。どのように私はこれを回避することができますか、あるいはむしろ、それのための数学は何でしょうか?

次の基本サブクラスを持つ標準QDialog:

class Main(QtGui.QDialog):
    def __init__(self, args):
        QtGui.QDialog.__init__(self)

    def mouseMoveEvent(self, event):
        super(Main, self).mouseMoveEvent(event)
        if self.leftClick == True: self.moveWindow(event.globalPos())

    def mousePressEvent(self, event):
        super(Main, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.leftClick = True

    def mouseReleaseEvent(self, event):
        super(Main, self).mouseReleaseEvent(event)
        self.leftClick = False
4

2 に答える 2

2

event.pos()の代わりに、event.globalPos()を呼び出してみてください。QMouseEventリファレンスから、「マウスイベントの結果としてウィジェットを移動する場合は、globalPos()によって返されるグローバル位置を使用して、揺れる動きを回避してください。」

于 2011-04-28T19:41:10.353 に答える
2

提案された解決策はウィンドウを移動しますが、マウスカーソルはウィンドウの0,0にジャンプします。マウスカーソルを常にウィンドウのx、yに置いておきたいと思いました。

[QT5の]コードのアップグレードバージョンは次のとおりです。

X=0
X2=8  #!!!!
Y=0
Y2=30 #!!!!
class Main(QtWidgets.QMainWindow):
    leftClick = False #! IMPORTANT

    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    def mouseMoveEvent(self, event):
        super(Main, self).mouseMoveEvent(event)
        if self.leftClick == True: 
            self.move(event.globalPos().x()-X-X2,event.globalPos().y()-Y-Y2)

    def mousePressEvent(self, event):
        super(Main, self).mousePressEvent(event)
        if event.button() == QtCore.Qt.LeftButton:
            self.leftClick = True
            global X,Y
            X=event.pos().x()
            Y=event.pos().y()

    def mouseReleaseEvent(self, event):
        super(Main, self).mouseReleaseEvent(event)
        self.leftClick = False

フレームレスウィンドウ(で作成window.setMask())の場合、「マスクされた」フレームレスウィンドウは実際のフレームウィンドウよりも少し小さいため、X2やY2などの定数が必要です。この差を計算する方法はまだわかりません。

上。久しぶりに重大なバグを1つ見つけました。いずれかのプッシュボタンでマウスの左ボタンを押し(アプリケーションの開始直後)、マウスカーソルをそのプッシュボタンからドラッグすると、存在しない変数LeftClickを参照するため、アプリケーションがクラッシュします。そのため、クラスMainでLeftClickを作成する必要があります。

于 2015-12-08T12:01:36.240 に答える