2013-08-18 3 views
0

나는이 축척에 대한 답변을 사용하여 자동으로 올바르게 축척되는 커스텀 이미지 위젯을 만들었다. SO question 그것은 잘 작동하지만 지금은 이미지 위젯 인스턴스를 내 메인 윈도우의 중앙에 놓으려고합니다.동적 레이아웃에서 위젯을 센터링 하시겠습니까?

내 아이디어는 QHBoxLayout을 만들고 이미지 위젯을 추가 한 다음 hBox 인스턴스를 ui-> verticalLayout에 추가하는 것이 었습니다.

작동하지 않습니다. 이미지가 여전히 오류 메시지와 함께 플러시 왼쪽을 표시 가 QLayout가 : QLayout "를 추가하려고하면 이미 이미지 다음 그때 setAlignment` '에 몇 가지 변화를 시도

레이아웃 그러나이있다 MainWindow를"을 "MainWindow를 위해" 전혀 나타나지 않습니다. 내 간단한 테스트 코드는 아래와 같습니다.

무엇이 여기에 있습니까?

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QPixmap pix; 
    pix.load("/Users/home/Desktop/test.jpg"); 

    ImageLabel2* image = new ImageLabel2(this); 
    image->setPixmap(pix); 

    QHBoxLayout* hbox = new QHBoxLayout(this); 
    hbox->addWidget(image); 

    // hbox->setAlignment(image,Qt::AlignCenter); 

    hbox->setAlignment(Qt::AlignHCenter); 

    // ui->verticalLayout->addLayout(hbox); 

    ui->verticalLayout->addLayout(hbox); 

    // ui->verticalLayout->addWidget(image); 
    // ui->verticalLayout->setAlignment(image,Qt::AlignCenter); 
    // ui->verticalLayout->setAlignment(Qt::AlignHCenter); 

} 
+0

당신이 생성자에서 부모를 통과 할 필요가 없습니다, QHBoxLayout이 * hbox에 = ImageLabel2에 같은 새로운 QHBoxLayout(); * 이미지 = 새로운 ImageLabel2 (); addLayout 또는 addWidget을 호출하면 소유권이 레이아웃으로 전달되기 때문입니다. – Kunal

+0

@Kunal - 감사합니다. 네, 조금 더 읽고 소유권에 대해 더 잘 이해합니다. 그래도 센터를 작동 시키려고 노력하고 있습니다. –

+0

당신은 setStretch()를 시험해 볼 필요가 있을지 모르지만, 확실하지 않습니다. – Kunal

답변

1

아무도 나를 위해 일한 작동 더미는 QWidget과 Centrewidget을 설정, UI_MainWindow.h에서 볼 수 있습니다. 이유를 모르고 레이아웃 문제를 디버그하는 것이 어려워 보입니다.

replyQt Project.org 사이트에서 제 질문은 완벽하게 작동합니다. 그래서 내 솔루션은 아니지만이 "centering/resizing image"문제는 공통적 인 문제로 보이기 때문에 여기에 게시하고 있습니다.

class CustomWidget : public QWidget { 
public: 
    CustomWidget(const QPixmap &p, QWidget* parent = 0) 
     : QWidget(parent), pixmap(p) {} 

    void paintEvent(QPaintEvent * e) 
    { 
     QRect srcRect(QPoint(), pixmap.size()); 
     QSize dstSize = srcRect.size().scaled(
       e->rect().size(), Qt::KeepAspectRatio); 
     QRect dstRect(QPoint((width() - dstSize.width())/2, 
          (height() - dstSize.height())/2), dstSize); 

     QPainter p(this); 
     p.setRenderHint(QPainter::Antialiasing); 
     p.drawPixmap(dstRect, pixmap, srcRect); 
    } 
private: 
    QPixmap pixmap; 
}; 

다음 메인 창에서

:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    setCentralWidget(new CustomWidget(QPixmap("test.png"))); 
} 
2

이 시도 :

QHBoxLayout* hbox = new QHBoxLayout(this); 
hbox->addStretch(); 
hbox->addWidget(image); 
hbox->addStretch(); 
0

메인 창 (QMainwindow) API의 setCentralWidget를 중앙에 위젯을 정렬 할 수 있습니다.

참고 : centrewidget의 개념은 도킹 영역 (왼쪽, 오른쪽, 아래쪽, 위쪽)을 구별하는 것입니다. 누가 어떤 사람인지 알 수있는 방법을 중심으로 설명합니다. 우리가 QMainWindow와 함께 개발할 때, 당신은 코드 아래

여기에 제안

#include "mainwindow.h" 
#include <QLabel> 
#include <QHBoxLayout> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindowClass) 
{ 
    ui->setupUi(this); 

    QPixmap pix; 
    pix.load("C:\\Users\\user\\Desktop\\Uninstallation failure2.png"); 

    //Replace with ImageLabel2 
    QLabel* image = new QLabel(this); 
    image->setPixmap(pix); 

    QHBoxLayout* hbox = new QHBoxLayout(this); 
    hbox->addWidget(image); 
    QWidget* centreWidget = new QWidget(); 

    //QMainwindow, having a feature called centreWidget, to set the layout. 
    centreWidget->setLayout(hbox); 
    setCentralWidget(centreWidget); 
} 


MainWindow::~MainWindow() 
{ 

} 
관련 문제