也许我只是度过了糟糕的一天,但我似乎无法让它发挥作用。
我正在尝试将窗口小部件的位置设置在另一个窗口中,但它似乎总是偏移。
我的布局看起来像这样,我正在尝试在右上角的canvas
内制作一个“浮动”小部件。
我用这个逻辑重新实现了show
方法(也尝试了showEvent
):
def show(self):
pos = self.parent().mapToGlobal(self.parent().pos())
topright = self.parent().rect().topRight()
self.resize(QSize(self.geometry().width(), self.parent().geometry().size().height()))
newpos = (pos + topright) - QPoint(self.geometry().width(), 0)
self.move(newpos)
super(InfoDock, self).show()
结果如下:
使用以下内容将两个工具栏添加到canvas_page
self.canvas_page.layout().insertWidget(2, self.toolbar2)
self.canvas_page.layout().insertWidget(3, self.toolbar)
如果我删除这些调用,它会将小部件移动得更高,但它似乎仍然偏移了settignsLabel_2和line_2的大小
答案 0 :(得分:2)
要为窗口小部件设置绝对(浮动)位置,请重新实现其父级的resizeEvent,以及相对于该父级的小部件move():
def resizeEvent(self, event):
# move to top-right corner
self.widget.move(self.width() - self.widget.width() - 1, 1)
super(Canvas, self).resizeEvent(event)
<强>更新强>:
工作演示脚本:
from PyQt4 import QtCore, QtGui
class Window(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
toolbar = self.addToolBar('Toolbar')
toolbar.addAction('Action')
widget = QtGui.QWidget(self)
layout = QtGui.QVBoxLayout(widget)
self.canvas = Canvas(widget)
layout.addWidget(self.canvas)
self.setCentralWidget(widget)
class Canvas(QtGui.QGraphicsView):
def __init__(self, parent):
super(Canvas, self).__init__(parent)
self.widget = QtGui.QComboBox(self)
def resizeEvent(self, event):
self.widget.move(self.width() - self.widget.width() - 2, 2)
super(Canvas, self).resizeEvent(event)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
window.setGeometry(500, 300, 200, 200)
sys.exit(app.exec_())