QWidget的PyQt绝对位置

Posted

技术标签:

【中文标题】QWidget的PyQt绝对位置【英文标题】:PyQt absolute position of QWidget 【发布时间】:2018-01-31 14:30:24 【问题描述】:

我有一个QDialog,它有一个布局,在这个布局中有多个QWidgets。现在我有一个按钮,如果用户按下这个按钮,我想显示一个“工具提示”,它显示更多信息。这个“工具提示”必须包含一个布局。

为此,我想使用带有绝对位置的QWidget。当我将this question 中提到的代码放在一起时,该解决方案对我不起作用。我也尝试过使用QtWidget.raise_() 函数,但是QWidget 没有显示出来。

我将代码简化为以下示例:

# creating content
layout = QtWidgets.QVBoxLayout()
for i in range(0, 10):
    layout.addWidget(QtWidgets.QLabel("line  - bla bla bla bla bla bla".format(i)))

widget = QtWidgets.QWidget()
widget.setLayout(layout)    

# creating dialog and apply the layout
dialog = QtWidgets.QDialog()
dialog.setLayout(layout)

# creating the absolute positioned widget
absolute_layout = QtWidgets.QVBoxLayout()
absolute_layout.addWidget(QtWidgets.QLabel("Absolute positioned QWidget"))
absolute_layout.addWidget(QtWidgets.QLabel("With some widgets in itself"))
absolute_layout.addWidget(QtWidgets.QLabel("With some widgets in itself"))
absolute_layout.addWidget(QtWidgets.QLabel("With some widgets in itself"))

absolute = QtWidgets.QWidget(dialog)
absolute.setLayout(absolute_layout)

# show the absolute widget and move it
absolute.show()
absolute.move(10, 10)
absolute.raise_()

dialog.show()

对话框正确显示layout 中的内容,但absolute 未显示。

我做错了什么?

【问题讨论】:

在这样的微不足道的任务中使用小部件确实没有意义。工具提示可以呈现 html,因此只需使用 <table> 来布置文本。 @ekhumoro 是的,我知道。上面写的代码显然不是我的真实代码。正如我所写的,我需要在这个“工具提示”中使用QLayout 对象,这个布局包含一些自定义小部件。使用 html 我无法达到我想要的结果。 【参考方案1】:

通过使用...

absolute = QtWidgets.QWidget(dialog)

您已将absolute 设为dialog 的孩子。因此absolute 的几何结构在某种程度上总是由dialog 控制。如果您希望能够指定小部件的绝对几何形状,请使用...

absolute = QtWidgets.QWidget()

【讨论】:

但我难道没有absolute 成为dialog 的孩子吗?如果我调用没有子级的QWidgetshow() 方法,它将显示为一个新窗口。【参考方案2】:

所以在@G.M. 的帮助下。我发现解决方案真的很简单:

absolute = QtWidgets.QWidget()
absolute.setParent(dialog)

我期待QWidget::QWidget(QWidget * parent = 0, Qt::WindowFlags f = 0) 构造函数在内部调用QWidget::setParent(QWidget * parent) 方法(这不是真的吗?)。

【讨论】:

以上是关于QWidget的PyQt绝对位置的主要内容,如果未能解决你的问题,请参考以下文章

必须在 QWidget Pyqt5 之前构造 QApp

PyQt5 样式表用于 QWidget 的孩子更改 QWidget

Pyqt5_QWidget

PyQt - QWidget - 仅显示标题栏

setParent 的 PyQt5 行为以显示没有布局的 QWidget

PyQt 打印 QWidget