在动态布局中居中小部件?

时间:2013-08-18 22:42:36

标签: qt

我正在使用此SO question的答案来制作自动缩放的自定义图像窗口小部件。它工作正常,但现在我试图将图像小部件实例集中在我的主窗口的中心。

我的想法是创建一个QHBoxLayout,将图像小部件添加到该小部件,然后将hBox实例添加到ui-> verticalLayout。

不起作用。图像仍显示左侧齐平,并显示错误消息: QLayout:尝试将QLayout“”添加到MainWindow“MainWindow”,已经有布局

然后我在'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);

}

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分: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 :(得分:0)

主窗口(QMainwindow)API setCentralWidget,用于将小部件对齐在中心。

注意:centrewidget的概念,是区分对接区域(左,右,下,顶)。 在一个中心,有人知道谁在哪里。当我们使用QMainWindow进行开发时,您可以在UI_MainWindow.h中看到,使用虚拟QWidget设置Centrewidget

  

下面的代码可以使用

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

}