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

Qt 在动态布局中居中小部件?,qt,Qt,我正在使用这个问题的答案来制作一个自定义图像小部件,它可以自动正确缩放。它工作得很好,但现在我正在尝试将图像小部件实例放在主窗口的中心 我的想法是创建一个QHBoxLayout,将图像小部件添加到其中,然后将hBox实例添加到ui->verticalLayout 不起作用。该图像仍显示“左对齐”,并显示错误消息:QLayout:正在尝试将QLayout“”添加到已具有布局的MainWindow“MainWindow” 然后,我尝试了“setAlignment”的一些变体,但是图像根本没有出现。下

我正在使用这个问题的答案来制作一个自定义图像小部件,它可以自动正确缩放。它工作得很好,但现在我正在尝试将图像小部件实例放在主窗口的中心

我的想法是创建一个
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);

}
试试这个:

QHBoxLayout* hbox = new QHBoxLayout(this);
hbox->addStretch();
hbox->addWidget(image);
hbox->addStretch();
试试这个:

QHBoxLayout* hbox = new QHBoxLayout(this);
hbox->addStretch();
hbox->addWidget(image);
hbox->addStretch();
主窗口(QMainwindow)API setCentralWidget将小部件对齐到中心。

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

下面的代码将起作用

#包括“mainwindow.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
ui(新ui::MainWindowClass)
{
用户界面->设置用户界面(此);
QPixmap-pix;
加载(“C:\\Users\\user\\Desktop\\uninstalloation failure2.png”);
//替换为ImageLabel2
QLabel*image=新的QLabel(此);
图像->设置像素点贴图(像素点);
QHBoxLayout*hbox=新的QHBoxLayout(本);
hbox->addWidget(图像);
QWidget*centreWidget=新的QWidget();
//QMainwindow具有名为centreWidget的功能,用于设置布局。
centreWidget->setLayout(hbox);
设置中心Widget(中心Widget);
}
MainWindow::~MainWindow()
{
}
主窗口(QMainwindow)API setCentralWidget将小部件对齐在中心。

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

下面的代码将起作用

#包括“mainwindow.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
ui(新ui::MainWindowClass)
{
用户界面->设置用户界面(此);
QPixmap-pix;
加载(“C:\\Users\\user\\Desktop\\uninstalloation failure2.png”);
//替换为ImageLabel2
QLabel*image=新的QLabel(此);
图像->设置像素点贴图(像素点);
QHBoxLayout*hbox=新的QHBoxLayout(本);
hbox->addWidget(图像);
QWidget*centreWidget=新的QWidget();
//QMainwindow具有名为centreWidget的功能,用于设置布局。
centreWidget->setLayout(hbox);
设置中心Widget(中心Widget);
}
MainWindow::~MainWindow()
{
}

这里的建议对我都不管用。不知道为什么,而且似乎很难调试布局问题

然而,我在网站上的问题解决方案是完美的。所以不是我的解决方案,但我把它张贴在这里,因为“居中/调整图像大小”问题似乎是一个常见问题

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")));
}

这里的建议对我都不管用。不知道为什么,而且似乎很难调试布局问题

然而,我在网站上的问题解决方案是完美的。所以不是我的解决方案,但我把它张贴在这里,因为“居中/调整图像大小”问题似乎是一个常见问题

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")));
}

您不需要在构造函数中传递父级,QHBoxLayout*hbox=new QHBoxLayout();,与ImageLabel2相同*image=newImageLabel2();因为当您调用addLayout或addWidget时,所有权转移到layout。@Kunal-谢谢。是的,我读了更多的书,对所有权有了更好的了解。但仍在尝试使“中心对齐”正常工作。您可能需要试用setStretch(),我不确定问题是,您的ImageLabel实例的大小是固定的还是至少是最大的?如果没有最大尺寸,Qt布局将拉伸整个控件。例如,通过将
背景色设置为红色来测试这一点。您确定是您的
ImageLabel2
小部件没有居中吗?可能是小部件中的图像没有居中。您不需要在构造函数中传递父级,QHBoxLayout*hbox=new QHBoxLayout();,与ImageLabel2相同*image=newImageLabel2();因为当您调用addLayout或addWidget时,所有权转移到layout。@Kunal-谢谢。是的,我读了更多的书,对所有权有了更好的了解。但仍在尝试使“中心对齐”正常工作。您可能需要试用setStretch(),我不确定问题是,您的ImageLabel实例的大小是固定的还是至少是最大的?如果没有最大尺寸,Qt布局将拉伸整个控件。例如,通过将
背景色设置为红色来测试这一点。您确定是您的
ImageLabel2
小部件没有居中吗?可能是小部件中的图像没有居中。