Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
轉載地址:
https://blog.csdn.net/tianyuan521521/article/details/46290525
前言
最近一直使用QGraphicsView框架在我的一個實際項目中,官方文檔好多都沒說清楚啊,有木有?!文檔都翻光了,卻還是有好多沒明白。?
一個令我惱火的bug就是,明明log打出來的每個Item的坐標都是預期的,但為什么最后結果不對呢??
我在視圖中添加了一個直線項(QPoint(0,0),QPoint(100,100));?
結果卻是:?
?
有的同行看到可能會一下指出,我沒有設置QGraphicsScene的SceneRect,所以所有的元素默認顯示。?
是的,上面這個例子的確如此,但是即使我們設置了呢,結果卻是這樣:?
?
直線項確實不居中了,但是端點也沒有在左上角啊!下面,我們就來深入結合例子弄清楚這一些問題。
解決之道
先上demo代碼,很簡單,
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QGraphicsView> #include<QGraphicsScene> #include<QDebug> namespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();void showView();//顯示graphicsView的函數 private:QGraphicsScene *graphicsScene;//scene聲明QGraphicsView *graphicsView;//view聲明Ui::MainWindow *ui; };#endif // MAINWINDOW_H- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize window =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->addLine(0,0,100,100);} void MainWindow::showView() {graphicsView->show(); }MainWindow::~MainWindow() {delete ui; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
main.cpp
#include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);qDebug() <<"line location:"<<"\n";qDebug()<<"startPoint:" <<QPoint(0,0);qDebug()<<"endPoint:" <<QPoint(100,100);MainWindow w;w.show();w.showView();return a.exec(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
這份代碼確實是QGraphicsScene和QGraphicsView的基本代碼,并沒有設置QGraphicsScene的sceneRect,所以結果也是大家可以預測的那樣居中顯示:?
?
但是!很多時候框架中自認為很令人方便的設計一點都不利于我們開發,我們開發人員習慣的坐標系統是左上角為(0,0)的坐標系統!?
于是,官方給出了解決方案:使用void setSceneRect(const QRectF & rect)控制sceneRect區域,這很人迷惑,就在我們這個例子中,我們想讓scene左上角坐標是(0,0),是不是說只需要scene->setSceneRect(QRectF(0,0,W,H)就可以了呢?很遺憾的是,實驗結果告訴我們不是:?
我們在上面的mainwindow.cpp里面設置scenRect為(0,0,150,150)試試看!:
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize window =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->setSceneRect(0,0,150,150);graphicsScene->addLine(0,0,100,100);} void MainWindow::showView() {graphicsView->show(); }MainWindow::~MainWindow() {delete ui; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
結果是:?
?
結果不是預期!?
其實,正確的解決方案是setSceneRect(0,0,W,H);而且需要
- W>=static_cast< QWidget *>(graphicsScene->parent())->size().width()
- H>=static_cast< QWidget *>(graphicsScene->parent())->size().height()
看再次修改后的代碼:
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QWidget> MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);graphicsScene = new QGraphicsScene(this);graphicsView = new QGraphicsView(graphicsScene,this);QSize windowsize =this->size();graphicsView->setFixedSize(this->width(),this->height());graphicsScene->setSceneRect(0,0,static_cast<QWidget *>(graphicsScene->parent())->size().width(),static_cast<QWidget *>(graphicsScene->parent())->size().height());graphicsScene->addLine(0,0,100,100);} void MainWindow::showView() {graphicsView->show(); }MainWindow::~MainWindow() {delete ui; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
運行結果:
?
下面有相應的工程下載:?
戳我下載
總結
以上是生活随笔為你收集整理的Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ STL string的属性
- 下一篇: Qt工作笔记-QXmlStreamRea