0

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

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

不工作。图像仍然显示左对齐并显示错误消息:QLayout: Attempting to add QLayout "" to MainWindow "MainWindow", which has a layout

然后我尝试了一些关于“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);

}
4

3 回答 3

2

尝试这个:

QHBoxLayout* hbox = new QHBoxLayout(this);
hbox->addStretch();
hbox->addWidget(image);
hbox->addStretch();
于 2013-08-19T05:51:01.653 回答
1

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

但是,在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")));
}
于 2013-08-19T22:38:12.507 回答
0

主窗口(QMainwindow) API setCentralWidget 将小部件居中对齐。

注意:centerwidget的概念,是区分停靠区域(左、右、下、上)。没有中心,有人怎么知道谁在哪里。当我们使用 QMainWindow 进行开发时,您可以在 UI_MainWindow.h 中看到,将 Centrewidget 设置为 dummy 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()
{

}
于 2013-08-19T07:10:41.790 回答