QGraphicsViewに表示した画像をレイアウトしたい + 画像とViewとの間のマージンをなくしたい
Unsolved
Japanese
-
参考ページ
https://stackoverflow.com/questions/17028680/qt5-c-qgraphicsview-images-dont-fit-view-frameこのページに書かれているように、 Viewのサイズに合わせて、 画像を表示+レイアウトできるようにしたいのですが、 画像とViewの間にマージンがあり、これを消すことができません。
参考画像
階層を上から順に書くと、(うまく書けませんでした・・・)
mainwindow
├graphicsView (graphicsScene)
├ graphicWidget
├ QGraphicsLinearLayout
└QGraphicsLayoutItem (この中にpixmapを登録。)の順で構成していると思っていますが、 現在表示されているマージンが、
・graphicsViewによるもの
・graphicsWidgetによるもの
・QGraphicsLinerLayoutによるもの
のどれかが関係しているのではないかと思っていますが、特定まで至れません。Qtだけでなく、プログラム自体経験が浅い人間ですので、
どんなアドバイスでもお待ちしております、
宜しくお願い致します※teratailという別のフォーラムでも同じ質問をしています。
答えがわかったらどちらにも答えを書き込もうと考えています。#include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 MainWindow::MainWindow(QWidget *parent) : 5 QMainWindow(parent), 6 ui(new Ui::MainWindow) 7 { 8 ui->setupUi(this); 9 ui->graphicsView->show(); 10 check_w = 0; 11 check_h = 0; 12 check_w = ui->graphicsView->width(); 13 check_h = ui->graphicsView->height(); 14 15 qDebug("check_w: %d\n",check_w); 16 qDebug("check_h : %d\n",check_h); 17 18 scene = new QGraphicsScene(); 19 Graph_Widgets = new Graph_Widget; 20 21 ui->graphicsView->setAlignment(Qt::AlignLeft|Qt::AlignTop); 22 23 Graph_Widgets->View_width = check_w; 24 Graph_Widgets->View_height = check_h; 25 26 Graph_Widgets->set_Item(); 27 28 scene->addItem(Graph_Widgets); 29 30 ui->graphicsView->setScene(scene); 31 ui->graphicsView->repaint(); 32 33 34 35 scene2 = new QGraphicsScene(); 36 Graph_Widgets2 = new Graph_Widget; 37 38 ui->graphicsView_2->setAlignment(Qt::AlignLeft|Qt::AlignBottom); 39 ui->graphicsView_2->setBackgroundBrush(Qt::black); 40 ui->graphicsView_2->setFrameStyle(QFrame::NoFrame); 41 ui->graphicsView_2->setContentsMargins(0,0,0,0); 42 check_x2 = ui->graphicsView_2->x(); 43 check_y2 = ui->graphicsView_2->y(); 44 //ui->graphicsView_2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 45 //ui->graphicsView_2->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 46 QRect ref_Rect2 = QRect((qreal)check_x2,(qreal)check_y2,(qreal)check_w,(qreal)check_h); 47 ui->graphicsView_2->setGeometry(ref_Rect2); 48 scene2->setSceneRect(0,0,(qreal)check_w,(qreal)check_h); 49 ui->graphicsView_2->setScene(scene2); 50 51 52 53 Graph_Widgets2->View_width = check_w; 54 Graph_Widgets2->View_height = check_h; 55 Graph_Widgets2->setContentsMargins(0,0,0,0); 56 Graph_Widgets2->setWindowFrameMargins(0,0,0,0); 57 Graph_Widgets2->set_Item(); 58 scene2->addItem(Graph_Widgets2); 59 60 61 qDebug("Graph_Widgets->View_width : %d\n",Graph_Widgets->View_width); 62 qDebug("Graph_Widgets->View_height : %d\n",Graph_Widgets->View_height); 63 //qDebug("check_w :%3.2lf\n",(qreal)check_w); 64 //qDebug("check_h :%3.2lf\n",(qreal)check_h); 65 66 ui->graphicsView_2->show(); 67 68 69 scene3 = new QGraphicsScene(); 70 71 check_x = ui->graphicsView_3->x(); 72 check_y = ui->graphicsView_3->y(); 73 74 QRect ref_Rect = QRect((qreal)check_x,(qreal)check_y,(qreal)check_w,(qreal)check_h); 75 //ui->graphicsView_3->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 76 //ui->graphicsView_3->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 77 ui->graphicsView_3->setGeometry(ref_Rect); 78 ui->graphicsView_3->setBackgroundBrush(Qt::blue); 79 ui->graphicsView_3->setContentsMargins(0,0,0,0); 80 //ui->graphicsView_3->setAlignment(Qt::AlignLeft|Qt::AlignBottom); 81 82 //これ必須っぽい。(消すと画像表示しない) 83 scene3->setSceneRect(0,0,(qreal)check_w,(qreal)check_h); 84 ui->graphicsView_3->setScene(scene3); 85 QRectF sceneRect = ui->graphicsView_3->sceneRect(); 86 87 QPixmap pixmap = QPixmap("/home/pi/G_Layout_test/nukiro.jpeg"); 88 qDebug("sceneRect.width(): %3.2lf\n",sceneRect.width()); 89 pixmap = pixmap.scaledToWidth(sceneRect.width()); 90 QGraphicsPixmapItem* pPixmap = new QGraphicsPixmapItem(); 91 pPixmap->setPixmap(pixmap); 92 scene3->addItem(pPixmap); 93 94 95 //ui->graphicsView_3->fitInView(pPixmap); 96 //ui->graphicsView_3->show(); 97 qDebug("graphicsView3-show after"); 98 99 100 101 102 qDebug("Graph_Widgets->View_width : %d\n",Graph_Widgets->View_width); 103 qDebug("Graph_Widgets->View_height : %d\n",Graph_Widgets->View_height); 104 //qDebug("check_w :%3.2lf\n",(qreal)check_w); 105 //qDebug("check_h :%3.2lf\n",(qreal)check_h); 106 107 108 } 109 110 MainWindow::~MainWindow() 111 { 112 delete ui; 113 } 114 115 void MainWindow::showEvent(QShowEvent *) 116 { 117 qDebug("showEvent\n"); 118 //ui->graphicsView_2->fitInView(scene2->sceneRect(),Qt::KeepAspectRatio); 119 //ui->graphicsView_3->fitInView(scene3->sceneRect(),Qt::KeepAspectRatio); 120 ui->graphicsView_2->show(); 121 ui->graphicsView_3->show(); 122 ui->graphicsView_4->show(); 123 }
1 #include "graph_widget.h" 2 3 Graph_Widget::Graph_Widget(QGraphicsWidget *parent) : QGraphicsWidget(parent, Qt::Widget) 4 { 5 qDebug("Graph_Widget View_width : %d\n",View_width); 6 qDebug("Graph_Widget View_height : %d\n",View_height); 7 8 9 windowLayout = new QGraphicsLinearLayout(Qt::Vertical); 10 linear = new QGraphicsLinearLayout(Qt::Vertical,windowLayout); 11 12 13 Item = new Layout_test_Item; 14 15 16 windowLayout->setSpacing(0.0); 17 double check_space = windowLayout->spacing(); 18 qDebug("check_space windowLayout : %3.2lf",check_space); 19 20 linear->setSpacing(0.0); 21 double check_space2 = linear->spacing(); 22 qDebug("check_space2 linearLayout : %3.2lf",check_space2); 23 24 25 windowLayout->setAlignment(Item,Qt::AlignTop|Qt::AlignLeft); 26 linear->setAlignment(Item,Qt::AlignTop|Qt::AlignLeft); 27 28 29 //geom_test = QRectF(0,0,(qreal)View_width,(qreal)View_height); 30 31 } 32 33 34 35 void Graph_Widget::set_Item() 36 { 37 qDebug("Graph_Widget setItem\n"); 38 // geom_test = QRectF(0,0,(qreal)View_width,(qreal)View_height); 39 40 test1 = QPixmap("/home/pi/G_Layout_test/nukiro.jpeg"); 41 Item->set_Pixmap(test1,View_width,View_height); 42 linear->addItem(Item); 43 linear->setStretchFactor(Item, 1); 44 45 46 Item = new Layout_test_Item; 47 48 //linear->setAlignment(Item,Qt::AlignRight); 49 50 Item->set_Pixmap(QPixmap("/home/pi/G_Layout_test/nukiro.jpeg"),View_width,View_height); 51 52 linear->addItem(Item); 53 linear->setStretchFactor(Item, 1); 54 55 windowLayout->addItem(linear); 56 57 setLayout(windowLayout); 58 setWindowTitle(tr("Basic Graphics Layouts Example")); 59 60 }
1 #include "layout_test_Item.h" 2 3 Layout_test_Item::Layout_test_Item(QGraphicsItem *parent) 4 :QGraphicsLayoutItem(),QGraphicsItem(parent) 5 { 6 View_width = 0; 7 View_height = 0; 8 setGraphicsItem(this); 9 } 10 11 12 void Layout_test_Item::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, 13 QWidget *widget) 14 { 15 Q_UNUSED(widget); 16 Q_UNUSED(option); 17 QRectF frame(QPointF(0, 0), geometry().size()); 18 19 double geom_width = frame.width(); 20 double geom_height = frame.height(); 21 double geom_pos_right = frame.right(); 22 double geom_pos_left = frame.left(); 23 24 qDebug("geom_width : %3.2lf\n",geom_width); 25 qDebug("geom_height : %3.2lf\n",geom_height); 26 qDebug("geom_pos_right : %3.2lf\n",geom_pos_right); 27 qDebug("geom_pos_left: %3.2lf\n",geom_pos_left); 28 29 QPointF pixpos = QPointF(0,0); 30 painter->drawPixmap(pixpos, PXMP); 31 32 } 33 34 QRectF Layout_test_Item::boundingRect() const 35 { 36 qDebug("boundingRect\n"); 37 return QRectF(QPointF(0, 0), geometry().size()); 38 //return QRectF(QPointF(0, 0), QSizeF(0,0)); 39 } 40 41 void Layout_test_Item::setGeometry(const QRectF &geom) 42 { 43 qDebug("setGeometry\n"); 44 prepareGeometryChange(); 45 QGraphicsLayoutItem::setGeometry(geom); 46 47 setPos(geom.topLeft()); 48 } 49 50 51 QSizeF Layout_test_Item::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const 52 { 53 qDebug("sizeHint\n"); 54 int PXMP_width = PXMP.width(); 55 int PXMP_height = PXMP.height(); 56 57 switch (which) { 58 case Qt::MinimumSize: 59 case Qt::PreferredSize: 60 qDebug("checkPXMP width : %d",PXMP_width); 61 qDebug("checkPXMP height : %d",PXMP_height); 62 return PXMP.size(); 63 case Qt::MaximumSize: 64 return QSizeF(1000, 1000); 65 default: 66 break; 67 } 68 return constraint; 69 } 70 71 72 void Layout_test_Item::set_Pixmap(QPixmap pxmp , int width , int height) 73 { 74 PXMP = pxmp; 75 View_width = width; 76 View_height = height; 77 PXMP = PXMP.scaledToWidth(View_width,Qt::FastTransformation); 78 //PXMP = PXMP.scaled(300,View_height,Qt::KeepAspectRatio,Qt::FastTransformation); 79 qDebug("View_width(set_Pixmap) : %d\n",View_width); 80 }
※こちらに全てのコードがあります。
https://github.com/FUJI0130/G_Layout_test/tree/master/G_Layout_test