使用QTest::mousePress选择QGraphicsItem
我想用qgraphicsitem做一些单元测试。 下面是测试qgraphicsitem的简单代码使用QTest::mousePress选择QGraphicsItem,qt,unit-testing,qgraphicsview,qgraphicsitem,qtestlib,Qt,Unit Testing,Qgraphicsview,Qgraphicsitem,Qtestlib,我想用qgraphicsitem做一些单元测试。 下面是测试qgraphicsitem的简单代码 QTest::mousePress(viewToTest->viewport(),Qt::LeftButton,Qt::NoModifier,viewToTest->mapFromScene(50,50)); QGraphicsItem *item = viewToTest->itemAt(viewToTest->mapFromScene(50,50)); T
QTest::mousePress(viewToTest->viewport(),Qt::LeftButton,Qt::NoModifier,viewToTest->mapFromScene(50,50));
QGraphicsItem *item = viewToTest->itemAt(viewToTest->mapFromScene(50,50));
TestEventLoop::loop(1000);
QCOMPARE(item->isSelected(),true);
当我运行代码时,测试通过了。但我没有看到qgraphicsitem周围的选择矩形。有什么问题
下面是完整的代码
//MyItem implementation
#include "MyItem.h"
#include <QtCore/QDebug>
#include <QtGui/QGraphicsSceneMouseEvent>
MyItem::MyItem()
{
setFlags(QGraphicsItem::ItemIsSelectable);
contextMenu = new QMenu;
testAction = new QAction(contextMenu);
testAction->setText("Test action");
contextMenu->addAction(testAction);
}
MyItem::~MyItem()
{
}
QRectF MyItem::boundingRect() const
{
return QRectF(-5,-5,60,60);
}
void MyItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /* = 0 */ )
{
QPen itemPen;
itemPen.setColor(Qt::black);
itemPen.setWidth(2);
painter->setPen(itemPen);
painter->drawRect(QRectF(0,0,50,50));
if(isSelected())
{
QPen selectedPen;
selectedPen.setColor(Qt::red);
selectedPen.setWidth(4);
painter->setPen(selectedPen);
painter->drawRect(QRectF(-4,-4,58,58));
}
}
void MyItem::mousePressEvent( QGraphicsSceneMouseEvent *event )
{
if(event->button() == Qt::RightButton)
{
contextMenu->move(event->screenPos());
contextMenu->show();
}
else if(event->button() == Qt::LeftButton)
{
update();
}
else{}
QGraphicsItem::mousePressEvent(event);
}
QPainterPath MyItem::shape() const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}
//MyView implementation
#include "MyView.h"
#include "TestEventLoop.h"
#include <QtGui/QMouseEvent>
#include <QtCore/QDebug>
#include <QtGui/QGraphicsItem>
MyView::MyView()
: QGraphicsView()
{
}
MyView::~MyView()
{
}
void MyView::mousePressEvent(QMouseEvent *event)
{
qDebug()<<"Mouse clicked to:"<<event->pos();
QGraphicsView::mousePressEvent(event);
TestEventLoop::loop(1000);
}
void MyView::mouseMoveEvent( QMouseEvent *event )
{
qDebug()<<"Mouse moved to:"<<event->pos();
}
//GraphicsViewTester implementation
#include "GraphicsViewTester.h"
#include "MyView.h"
#include "TestEventLoop.h"
#include <QtGui/QGraphicsItem>
GraphicsViewTester::GraphicsViewTester(MyView *view)
{
viewToTest = view;
}
GraphicsViewTester::~GraphicsViewTester()
{
}
void GraphicsViewTester::itemMouseClickTest()
{
QTest::mousePress(viewToTest->viewport(),Qt::LeftButton,Qt::NoModifier,viewToTest->mapFromScene(50,50));
QGraphicsItem *item = viewToTest->itemAt(viewToTest->mapFromScene(50,50));
TestEventLoop::loop(1000);
QCOMPARE(item->isSelected(),true);
}
//TestEventLoop implementation
#include "TestEventLoop.h"
TestEventLoop* TestEventLoop::instance = NULL;
TestEventLoop::TestEventLoop()
: QEventLoop()
{
}
TestEventLoop::~TestEventLoop()
{
}
TestEventLoop* TestEventLoop::getInstance()
{
if(instance == NULL)
{
instance = new TestEventLoop;
}
else{}
return instance;
}
void TestEventLoop::loop(const int msecs)
{
QTimer timer;
connect(&timer,SIGNAL(timeout()),TestEventLoop::getInstance(),SLOT(quit()));
timer.setSingleShot(true);
timer.start(msecs);
instance->exec();
}
//TestManager implementation
#include "TestManager.h"
#include "mainwindow.h"
#include "GraphicsViewTester.h"
TestManager::TestManager(void)
{
}
TestManager::~TestManager(void)
{
}
void TestManager::runTests()
{
MainWindow mainWindow;
GraphicsViewTester tester(mainWindow.sceneView());
QTest::qExec(&tester);
}
//MainWindow implementation
#include "mainwindow.h"
#include <QtCore/QDebug>
#include <QtGui/QGraphicsScene>
#include <QtGui/QHBoxLayout>
#include "MyView.h"
#include "MyItem.h"
MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
QGraphicsScene *scene = new QGraphicsScene;
scene->setSceneRect(0,0,ui.centralWidget->width(),ui.centralWidget->height());
QHBoxLayout *layout = new QHBoxLayout;
myView = new MyView;
myView->setScene(scene);
layout->addWidget(myView);
ui.centralWidget->setLayout(layout);
MyItem *myItem = new MyItem;
myItem->setPos(0,0);
scene->addItem(myItem);
}
MainWindow::~MainWindow()
{
delete myView;
}
MyView* MainWindow::sceneView() const
{
return myView;
}
//MyItem实现
#包括“MyItem.h”
#包括
#包括
MyItem::MyItem()
{
setFlags(QGraphicsItem::ItemIsSelectable);
contextMenu=新的QMenu;
testAction=新QAction(上下文菜单);
测试操作->设置文本(“测试操作”);
上下文菜单->添加操作(测试操作);
}
MyItem::~MyItem()
{
}
QRectF MyItem::boundingRect()常量
{
返回QRectF(-5,-5,60,60);
}
void MyItem::paint(QPainter*painter,const QStyleOptionGraphicsItem*选项,QWidget*widget/*=0*/)
{
QPen-itemPen;
itemPen.setColor(Qt::黑色);
itemPen.setWidth(2);
画师->设置笔(项目笔);
painter->drawRect(QRectF(0,0,50,50));
if(isSelected())
{
QPen选择笔;
选择Pen.setColor(Qt::红色);
选择笔。设置宽度(4);
画师->设置笔(选择笔);
painter->drawRect(QRectF(-4,-4,58,58));
}
}
void MyItem::MousePresseEvent(QGraphicsSceneMouseEvent*事件)
{
如果(事件->按钮()==Qt::RightButton)
{
上下文菜单->移动(事件->屏幕位置());
上下文菜单->显示();
}
else if(事件->按钮()==Qt::LeftButton)
{
更新();
}
else{}
QGraphicsItem::mousePressEvent(事件);
}
QPainterPath MyItem::shape()常量
{
QPainterPath路径;
addRect(boundingRect());
返回路径;
}
//MyView实现
#包括“MyView.h”
#包括“TestEventLoop.h”
#包括
#包括
#包括
MyView::MyView()
:QGraphicsView()
{
}
MyView::~MyView()
{
}
void MyView::MousePresseEvent(QMouseEvent*事件)
{
qDebug()exec();
}
//TestManager实现
#包括“TestManager.h”
#包括“mainwindow.h”
#包括“GraphicsViewTester.h”
TestManager::TestManager(无效)
{
}
TestManager::~TestManager(无效)
{
}
void TestManager::runTests()
{
主窗口主窗口;
GraphicsViewTester测试仪(mainWindow.sceneView());
QTest::qExec(&tester);
}
//主窗口实现
#包括“mainwindow.h”
#包括
#包括
#包括
#包括“MyView.h”
#包括“MyItem.h”
MainWindow::MainWindow(QWidget*父项,Qt::WFlags标志)
:QMainWindow(父项、标志)
{
ui.setupUi(这个);
Qgraphicscene*场景=新的Qgraphicscene;
场景->设置场景竖立(0,0,ui.centralWidget->width(),ui.centralWidget->height());
QHBoxLayout*布局=新的QHBoxLayout;
myView=新的myView;
myView->setScene(场景);
布局->添加小部件(myView);
ui.centralWidget->setLayout(布局);
MyItem*MyItem=新的MyItem;
myItem->setPos(0,0);
场景->添加项(myItem);
}
MainWindow::~MainWindow()
{
删除myView;
}
MyView*主窗口::sceneView()常量
{
返回myView;
}
在QTestLib教程中,他们说:
QTestLib具有一些测试图形用户界面的机制。
QTestLib不模拟本机窗口系统事件,而是发送
内部Qt事件。这意味着对心脏没有副作用
正在运行测试的机器
缺少选择矩形可能是由于此原因。我对QTableView有一个问题,原因是:双击无法正常工作,因为本机双击事件打开了单元格进行编辑,而测试事件没有打开。据我了解,根据您的经验和Qt文档,目前无法解决问题,应该可以创建您自己的(伪造的)本机事件,并将它们直接插入Qt的事件循环(不使用QTest的方法)。但是,我没有对此进行任何进一步的研究,因为QTestLib行为足以满足我们的需要(单击表视图,再单击打开的视口和单元格进行编辑)。