QGraphicsView - 视图导航不工作
QGraphicsView - view navigation not working
我正在尝试在 GraphicsView 显示的视口中移动。根据 Qt documentation,这可以通过调用 QGraphicsView class.
的 translate() 方法来完成
到目前为止,我已经尝试这样做但没有成功,而且到目前为止我还没有找到对这个问题的解释。谁能帮我 ?
我创建了一个简单示例来说明我的问题:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene = new QGraphicsScene();
ui->graphicsView->setScene(scene);
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(0,-10, 0,10));
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(-10,0, 10,0));
}
MainWindow::~MainWindow()
{
delete ui;
}
graphicsView 是 QGraphicsView 的子classed 类型。这是它的代码:
MyGraphicsView::MyGraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
}
void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Up)
translate(0, 10);
else if (event->key() == Qt::Key_Down)
translate(0, -10);
else if (event->key() == Qt::Key_Left)
translate(-10, 0);
else if (event->key() == Qt::Key_Right)
translate(10, 0);
update();
}
由于class很小,我觉得没有必要分享headers。但是,如果您觉得我应该这样做,请 post 发表评论,我会分享它们。
来自 QGraphicsView 文档:
QGraphicsView 在转换过程中保持视图的中心不变。由于场景对齐(setAligment()),平移视图不会有视觉影响。
如果您的目的是遍历整个场景,实际上您根本不需要实现 keyPressEvent,因为 QAbstractScrollArea(QGraphicsView 继承)已经为您完成了。你唯一需要确保的是场景比你的视口大,所以尝试初始化
QGraphicsScene *scene = new QGraphicsScene(0,0,1500,1500);
ui->graphicsView->setScene(scene);
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(750,730, 750,770));
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(730,750, 770,750));
如果您的目的是在场景中移动由两个 QGraphicsLineItem 组成的十字准线,那么实现它的方法是:
void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{
int i;
if (event->key() == Qt::Key_Up){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(0,-10);//-10, origin is top left
}
else if (event->key() == Qt::Key_Down){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(0,10);
}
else if (event->key() == Qt::Key_Left){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(-10,0);
}
else if (event->key() == Qt::Key_Right){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(10,0);
}
update();
}
这会遍历所有项目(如果您愿意,可以使用实际的迭代器)并根据您的意愿移动它们。这不是一个非常优雅的解决方案,但我相信这不是您所追求的。
我正在尝试在 GraphicsView 显示的视口中移动。根据 Qt documentation,这可以通过调用 QGraphicsView class.
的 translate() 方法来完成到目前为止,我已经尝试这样做但没有成功,而且到目前为止我还没有找到对这个问题的解释。谁能帮我 ? 我创建了一个简单示例来说明我的问题:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene *scene = new QGraphicsScene();
ui->graphicsView->setScene(scene);
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(0,-10, 0,10));
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(-10,0, 10,0));
}
MainWindow::~MainWindow()
{
delete ui;
}
graphicsView 是 QGraphicsView 的子classed 类型。这是它的代码:
MyGraphicsView::MyGraphicsView(QWidget *parent)
: QGraphicsView(parent)
{
}
void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Up)
translate(0, 10);
else if (event->key() == Qt::Key_Down)
translate(0, -10);
else if (event->key() == Qt::Key_Left)
translate(-10, 0);
else if (event->key() == Qt::Key_Right)
translate(10, 0);
update();
}
由于class很小,我觉得没有必要分享headers。但是,如果您觉得我应该这样做,请 post 发表评论,我会分享它们。
来自 QGraphicsView 文档:
QGraphicsView 在转换过程中保持视图的中心不变。由于场景对齐(setAligment()),平移视图不会有视觉影响。
如果您的目的是遍历整个场景,实际上您根本不需要实现 keyPressEvent,因为 QAbstractScrollArea(QGraphicsView 继承)已经为您完成了。你唯一需要确保的是场景比你的视口大,所以尝试初始化
QGraphicsScene *scene = new QGraphicsScene(0,0,1500,1500);
ui->graphicsView->setScene(scene);
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(750,730, 750,770));
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(730,750, 770,750));
如果您的目的是在场景中移动由两个 QGraphicsLineItem 组成的十字准线,那么实现它的方法是:
void MyGraphicsView::keyPressEvent(QKeyEvent *event)
{
int i;
if (event->key() == Qt::Key_Up){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(0,-10);//-10, origin is top left
}
else if (event->key() == Qt::Key_Down){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(0,10);
}
else if (event->key() == Qt::Key_Left){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(-10,0);
}
else if (event->key() == Qt::Key_Right){
for (i = 0; i < items().count(); i++)
items().takeAt(i)->moveBy(10,0);
}
update();
}
这会遍历所有项目(如果您愿意,可以使用实际的迭代器)并根据您的意愿移动它们。这不是一个非常优雅的解决方案,但我相信这不是您所追求的。