2013-08-18 54 views
0

我正在使用此SO question的答案來製作自動縮放正確的自定義圖像小部件。它工作正常,但現在我試圖將圖像小部件實例居中在我的主窗口的中心。將動態佈局中的小部件居中?

我的想法是創建一個QHBoxLayout,添加圖像小部件,然後將hBox實例添加到ui-> verticalLayout。

不起作用。圖像仍顯示左對齊,並顯示錯誤消息:QLayout:嘗試添加QLayout「」到主窗口「主窗口」,它已經具備了佈局

我又試圖在「setAlignment`有一些變化,但隨後的圖像根本沒有出現。我的簡單測試代碼如下。

我在這裏錯過了什麼?

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,負責*橫向盒=新QHBoxLayout,負責();同樣,以ImageLabel2 *圖像=新ImageLabel2( );因爲當您調用addLayout或addWidget時,所有權將轉移到佈局。 – Kunal

+0

@Kunal - 謝謝。是的,我讀了更多,更好地理解了所有權。仍然試圖讓中心對齊工作。 –

+0

可能你需要嘗試setStretch(),我不確定 – Kunal

回答

1

無的建議,在這裏爲我工作。不知道爲什麼,似乎很難調試佈局問題

reply對我的問題在Qt Project.org網站完美的作品。所以不是我的解決方案,但我在這裏發佈它,因爲這個「居中/調整大小的圖像」問題似乎是一個常見問題。

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的發展,你可以看到UI_MainWindow.h,設置Centrewidget與虛擬QWidget的

下面的代碼將工作

#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() 
{ 

}