如何移动模态对话框

1 投票
1 回答
593 浏览
提问于 2025-04-18 15:42

下面的代码创建了一个 QMainWindow 窗口。在这个窗口的框架内右键点击会调用 up 函数。这个函数的作用是让 self.modal 这个模态的 QDialog 窗口显示出来。

问题是:为什么 self.modal 这个对话框没有按照要求移动到鼠标的位置,尽管在 up() 函数里有一行代码 self.modal.move(QtGui.QCursor.pos()) 是这样写的?

from PyQt4 import QtCore, QtGui
app = QtGui.QApplication([])
class AppWindow(QtGui.QMainWindow):
    def __init__(self):
        super(AppWindow, self).__init__()
        mainWidget=QtGui.QWidget()
        self.setCentralWidget(mainWidget)
        mainLayout = QtGui.QVBoxLayout()
        mainWidget.setLayout(mainLayout)
        frame=QtGui.QFrame()
        frame.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        frame.connect(frame, QtCore.SIGNAL("customContextMenuRequested(QPoint)" ), self.up)
        mainLayout.addWidget(frame)

        self.modal=QtGui.QDialog()
        self.modal.setModal(True)

    def up(self, QPos):
        print 'up  QPos: %s  QCursor: %s'%( QPos, QtGui.QCursor.pos() )
        self.modal.move(QtGui.QCursor.pos())
        self.modal.show()

window=AppWindow()
window.show()
sys.exit(app.exec_())

1 个回答

1

QCursor.pos() 这个函数会返回鼠标在整个屏幕上的位置。可是,QDialog.move() 这个函数需要的是窗口内部的坐标,所以你需要先把屏幕坐标转换成窗口坐标。可以用 self.modal.move(QWidget.mapFromGlobal(QtGui.QCursor.pos())) 这个方法来实现这个转换。

撰写回答