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

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

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

不行 . 图像仍显示左侧齐平并显示错误消息:QLayout:尝试添加QLayout“" to 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)

2 years ago

试试这个:

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

2 years ago

这里没有任何建议对我有用 . 不知道为什么,调试布局问题似乎很难

但是我在Qt Project.org网站上的问题reply完美无缺 . 所以不是我的解决方案,但我在这里发布它,因为这个"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 years ago

main window(QMainwindow) API setCentralWidget to align the widget on center.

注意: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()
{

}