Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QGraphicsViewに表示した画像をレイアウトしたい + 画像とViewとの間のマージンをなくしたい



  • 参考ページ
    https://stackoverflow.com/questions/17028680/qt5-c-qgraphicsview-images-dont-fit-view-frame

    このページに書かれているように、 Viewのサイズに合わせて、 画像を表示+レイアウトできるようにしたいのですが、 画像とViewの間にマージンがあり、これを消すことができません。

    参考画像
    alt text

    階層を上から順に書くと、(うまく書けませんでした・・・)
    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


Log in to reply