QGraphicsView -视图导航不工作
QGraphicsView - view navigation not working
我正试图移动由GraphicsView显示的视口。根据Qt文档,这可以通过调用QGraphicsView类的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的子类。下面是它的代码:
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();
}
由于类非常小,我认为没有必要共享头文件。但是,如果你觉得我应该这样做,请发表评论,我将分享它们。
从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));
如果您的目的是在场景中移动由两个QGraphicsLineItems组成的准星,那么一种方法是:
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();
}
这遍历所有项(如果您喜欢,可以使用实际的迭代器)并根据您的意愿移动它们。这不是一个非常优雅的解决方案,但我相信这不是你想要的。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- QGraphicsView -视图导航不工作
- CAtlHttpClient -导航到IP6地址似乎不工作