- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想测试从面板上按下按钮的功能。问题是该按钮不是 QPushButtons,而是 QGraphicWidget 元素。
如何生成此按钮,单击鼠标来测试其行为?
按钮不是简单的 QPushButton,因为它们在鼠标悬停时有特殊的行为,有动画等。这些按钮将添加到场景中,然后将场景添加到 View 中,并将 View 作为小部件添加到布局中。我可以看到可以使用以下方式单击 View :
QTest.mouseClick(self.panel_with_buttons.view.viewport(), Qt.LeftButton)
但这并没有点击按钮。我还尝试指定按钮的位置:
rect = self.panel_with_buttons.button2.boundingRect()
QTest.mouseClick(self.panel_with_buttons.view.viewport(), Qt.LeftButton, pos = rect.center())
但由于某种原因,这是不受支持的论点
Button 类和 PanelWithButtons 类的代码 (panel_with_buttons.py):
from PySide2 import QtWidgets, QtCore, QtGui
class Button(QtWidgets.QGraphicsWidget):
pressed = QtCore.Signal()
def __init__(self, image_path: str, parent=None):
super().__init__(parent)
self._pixmap = QtGui.QPixmap(image_path)
def paint(self, painter, option, widget=None):
painter.setPen(QtCore.Qt.NoPen)
painter.drawPixmap(0, 0, self._pixmap)
def mousePressEvent(self, event: QtWidgets.QGraphicsSceneMouseEvent):
self.pressed.emit()
class PanelWithButtons(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.button = QtWidgets.QPushButton('button1')
self.button.clicked.connect(self.button_clicked)
pix = 'home.png'
self.button2 = Button(pix)
self.button2.pressed.connect(self.button2_pressed)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.button)
self.scene = QtWidgets.QGraphicsScene()
self.scene.addItem(self.button2)
self.view = QtWidgets.QGraphicsView(self.scene)
layout.addWidget(self.view)
self.setLayout(layout)
@QtCore.Slot()
def button_clicked(self):
print('button1 clicked')
@QtCore.Slot()
def button2_pressed(self):
print('button2 pressed')
测试.py:
from unittest import TestCase
from PySide2 import QtWidgets
from PySide2.QtTest import QTest
from PySide2.QtCore import Qt, QPoint
from test.panel_with_buttons import PanelWithButtons
class TestPanel(TestCase):
def setUp(self) -> None:
app = QtWidgets.QApplication()
self.panel_with_buttons = PanelWithButtons()
def test_go_cargo(self):
QTest.mouseClick(self.panel_with_buttons.button, Qt.LeftButton)
rect = self.panel_with_buttons.button2.boundingRect()
QTest.mouseClick(self.panel_with_buttons.view.viewport(), Qt.LeftButton)
作为输出,我收到了对第一个按钮的鼠标点击(我可以看到“button1 clicked”),但我不知道如何生成对第二个按钮的点击。
最佳答案
panel_with_buttons.py 文件存在以下错误:
您必须创建资源的绝对路径,在本例中为图像的路径。当您运行 .py 文件时,如果传递了相对路径,则这将是启动脚本的位置,这可能会带来问题(假设图像位于 panel_with_buttons.py 旁边)。
您必须使用 resize() 方法将按钮的大小设置为图像的大小。
考虑到该文件应如下所示:
import os
from PySide2 import QtWidgets, QtCore, QtGui
current_dir = os.path.dirname(os.path.realpath(__file__))
class Button(QtWidgets.QGraphicsWidget):
pressed = QtCore.Signal()
def __init__(self, image_path: str, parent=None):
super().__init__(parent)
self._pixmap = QtGui.QPixmap(image_path)
self.resize(self._pixmap.size())
def paint(self, painter, option, widget=None):
painter.setPen(QtCore.Qt.NoPen)
painter.drawPixmap(0, 0, self._pixmap)
def mousePressEvent(self, event: QtWidgets.QGraphicsSceneMouseEvent):
self.pressed.emit()
super().mousePressEvent(event)
class PanelWithButtons(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.button = QtWidgets.QPushButton("button1")
self.button.clicked.connect(self.button_clicked)
print(os.getcwd())
pix = os.path.join(current_dir, "home.png")
self.button2 = Button(pix)
self.button2.pressed.connect(self.button2_pressed)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.button)
self.scene = QtWidgets.QGraphicsScene()
self.scene.addItem(self.button2)
self.view = QtWidgets.QGraphicsView(self.scene)
layout.addWidget(self.view)
self.setLayout(layout)
@QtCore.Slot()
def button_clicked(self):
print("button1 clicked")
@QtCore.Slot()
def button2_pressed(self):
print("button2 pressed")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = PanelWithButtons()
w.show()
sys.exit(app.exec_())
另一方面,您必须使用Button的mapToScene和QGraphicsView的mapFromScene方法获得属于Button的点相对于视口(viewport)的位置,在这种情况下,该点将是Button的中心。
from unittest import TestCase
from PySide2 import QtCore, QtCore, QtWidgets, QtTest
from test.panel_with_buttons import PanelWithButtons
class TestPanel(TestCase):
def setUp(self) -> None:
app = QtWidgets.QApplication()
self.panel_with_buttons = PanelWithButtons()
self.panel_with_buttons.resize(640, 480)
def test_go_cargo(self):
QtTest.QTest.mouseClick(
self.panel_with_buttons.button, QtCore.Qt.LeftButton
)
it = self.panel_with_buttons.button2
sp = it.mapToScene(it.rect().center())
p = self.panel_with_buttons.view.mapFromScene(sp)
QtTest.QTest.mouseClick(
self.panel_with_buttons.view.viewport(), QtCore.Qt.LeftButton, pos=p
)
关于python - 如何在QTest中的QGraphicsWidget上生成鼠标点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57007556/
在我的应用程序中,我继承了 QGraphicsWidget 在绘画中,我画了一条笔宽为 4 的线。 我重新实现了 boundingRect() 和 shape()。 但是每次单击鼠标右键时我都无法捕获
在我的应用程序中,我有两种对象类型。一个是字段项,另一个是复合项。复合项可能包含两个或更多字段项。这是我的复合项目实现。 #include "compositeitem.h" CompositeIte
我是第一次使用 QGraphicsView/Scene。这是在 PyQt 中,但除了 Python 与多重继承不同之外,我认为这是一个通用的 Qt 问题。 我首先创建了几个 QGraphicsItem
我有一个名为“TestContentArea”的自定义 QGraphicsWidget,它已添加到 QGraphicsScene。在我的自定义 QGraphicsWidget 中,我添加了一些添加到其
我正在制作简单的 2D 游戏(迷宫),我正在使用 QGraphicsView、QGraphicsScene 和 QGraphicsGridLayout 来管理网格中的图 block 。 map 用字符
我试图在 QGraphicsWidget 中显示 QGraphicsView,但我似乎无法让它工作。 这就是我想要实现的目标,其中QGraphicsWidgets全部添加到QGraphicsScene
我正在尝试在 qgraphicswidget 中绘制文本。场景的水平比例为 -180 到 180,垂直比例为 -90 到 +90(这是一张世界地图)。 当我放大 map 上的单个项目时,我希望显示一些
我想在我的 QGraphicswidget 中嵌入一个 QWidget,例如按钮或进度条,但我只看到了将 QWidget 添加到 QGraphicsScene 的示例,即 m_scene->addWi
首先我应该说我已经尝试从所有 POV 来看这个问题。我也在 freenode 上询问过,有人向我提出了一些建议,但最终证明这些建议不可能奏效。 在我看来,那些提出建议的人似乎并不真正了解类层次结构和概
有没有可能 QGraphicsWidget成为 QWidget 的 parent ?我有一个 QGraphicsItem我想添加一个 QWidget在此项目中,如何设置 QWidget在QGraphi
这是否可能具有 QObjects 和(例如)QGraphicsWidgets 的树状结构?我的意思是,我不能像这样编写初始化列表: class MyButton : public QGraphicsW
我通过 QGraphicsProxyWidget 向图形场景 (QGraphicScene) 添加了一个小部件。问题是当我选择项目时它被选中,但选择边框不可见。 代码如下: QDial *di
我已经建立了一个自定义 QGraphicsView为某些按键事件定义了行为。 View 显示 QGraphicsScene与 QGraphicsProxyWidgets . 问题是,一旦我覆盖了 ke
我希望我的 QGraphicsWidget 根据场景的大小来缩放它的大小。我目前拥有的 QGraphicsWidget 是固定大小,具体取决于 sizeHint 的返回值(QGraphicsWidge
我有一个相当简单的 PyQt 应用程序,我在其中将 QGraphicsWidget 的实例放置在 QGraphicsGridLayout 中,并希望将小部件与用 QGraphicsPath 绘制的线连
我正在将更大的 QGraphicsItems 程序转换为 QGraphicsWidgets(为了打字,我们称它们为 item 和 widget)。鼠标悬停现在失败,因为小部件的位置和/或矩形与旧项目不
我是一名优秀的程序员,十分优秀!