如何移动模态对话框
下面的代码创建了一个 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()))
这个方法来实现这个转换。