Qt QGraphicsItem setPos未移动项目';s位置
我所拥有的与以下类似:Qt QGraphicsItem setPos未移动项目';s位置,qt,qgraphicsitem,Qt,Qgraphicsitem,我所拥有的与以下类似: int main(int argc, char **argv) { QApplication app(argc, argv); MainWindow appWindow; appWindow.show(); return app.exec(); } class MainWindow : public QMainWindow { ... private: QGraphicsScene *mScene; QGraphicsView *mView;
int main(int argc, char **argv) {
QApplication app(argc, argv);
MainWindow appWindow;
appWindow.show();
return app.exec();
}
class MainWindow : public QMainWindow {
...
private:
QGraphicsScene *mScene;
QGraphicsView *mView;
QGraphicsItem *mItem;
QPushButton *mButton1, *mButton2;
};
MainWindow::MainWindow(...) {
mScene = new QGraphicsScene(this);
mScene->setItemIndexMethod(QGraphicsScene::NoIndex);
mView = new QGraphicsView(mScene, this);
mView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
mButton1 = new QPushButton("Create Item", this);
QObject::connect(mButton1, SIGNAL(clicked()), ...);
mButton2 = new QPushButton("Set Item Position");
QObject::connect(mButton2, SIGNAL(clicked()), ...);
}
void MainWindow::button1Clicked() {
mItem = new QGraphicsSimpleTextItem("Test Item");
mItem->setPos(mItem->pos() + QPointF(7.0f, 7.0f)); // doesn't work
mScene->addItem(mItem);
// even when I move the setPos() call after QGraphicsScene::addItem,
// the item still paints at the top-left corner (0.0f, 0.0f)
}
void MainWindow::button2Clicked() {
mItem->setPos(mItem->pos() + QPointF(7.0f, 7.0f)); // works perfect
}
我对Qt非常陌生,很可能误解了一个基本概念。有人能看出我做错了什么吗?来自医生:
默认情况下,当视图
第一次显示(通过调用
QGraphicscene::itemsBoundingRect()
这意味着当视图第一次显示时,它使用组合项边界作为其边界。因此,当您首次添加项目时,无论项目的位置如何,它都将用作显示场景的左上角。因此,您的项目实际上是移动的,但场景是以偏移显示的。所以它看起来是在(0,0)。当你第二次移动它时,它实际上已经移动了两次
解决方案是在显示前将设置为已知的rect。这将修复显示区域。来自文档:
默认情况下,当视图
第一次显示(通过调用
QGraphicscene::itemsBoundingRect()
这意味着当视图第一次显示时,它使用组合项边界作为其边界。因此,当您首次添加项目时,无论项目的位置如何,它都将用作显示场景的左上角。因此,您的项目实际上是移动的,但场景是以偏移显示的。所以它看起来是在(0,0)。当你第二次移动它时,它实际上已经移动了两次
解决方案是在显示前将设置为已知的rect。这将修复显示区域。我刚刚找到了解决方案,但在我发布自己问题的答案之前,你已经找到了。是的,您是对的,必须发出setscen直立()才能使项目定位正常工作。我发现的另一件事是,就定位而言,我将什么值传递给SetScenInstitute并不重要,也就是说,我尝试了1px的宽度和高度,并且项目正好定位在我想要的位置。谢谢你的详细解释。我刚刚想出了解决办法,但在我可以发布我自己问题的答案之前,你已经找到了。是的,您是对的,必须发出setscen直立()才能使项目定位正常工作。我发现的另一件事是,就定位而言,我将什么值传递给SetScenInstitute并不重要,也就是说,我尝试了1px的宽度和高度,并且项目正好定位在我想要的位置。不过非常感谢您详细解释。