Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不使用QSpacerItems的情况下将项目居中放置在QBoxLayout中_C++_Qt_Qlayout - Fatal编程技术网

C++ 如何在不使用QSpacerItems的情况下将项目居中放置在QBoxLayout中

C++ 如何在不使用QSpacerItems的情况下将项目居中放置在QBoxLayout中,c++,qt,qlayout,C++,Qt,Qlayout,QLayout总是尝试使用QWidget的整个可用空间。但是,有时,您希望它保持最小的大小,并将自身集中在小部件上……因为您觉得如果布局中只包含一些没有意义显示为大于其默认大小的项目(QLabel、QPushButton和类似的内容),那么它看起来会更好 我在过去有过几百次这个问题,我总是到处添加愚蠢的qspaceritem来解决这个问题。我想知道是否有更好的解决办法 我把这个问题孤立出来作为一个例子: #include <QApplication> #include <QDi

QLayout总是尝试使用QWidget的整个可用空间。但是,有时,您希望它保持最小的大小,并将自身集中在小部件上……因为您觉得如果布局中只包含一些没有意义显示为大于其默认大小的项目(QLabel、QPushButton和类似的内容),那么它看起来会更好

我在过去有过几百次这个问题,我总是到处添加愚蠢的qspaceritem来解决这个问题。我想知道是否有更好的解决办法

我把这个问题孤立出来作为一个例子:

#include <QApplication>
#include <QDialog>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QSpacerItem>

class MainFrame : public QDialog
{
public:
    MainFrame() : QDialog(NULL)
    {
        QHBoxLayout* theLayout = new QHBoxLayout();
        setLayout( theLayout );

        // don't want to add spacers all the time!
        //theLayout->addSpacerItem( new QSpacerItem( 10, 10, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) );
        theLayout->addWidget( new QLabel( "A text", this ) );
        theLayout->addWidget( new QPushButton( "A button", this ) );
        // don't want to add spacers all the time!
        //theLayout->addSpacerItem( new QSpacerItem( 10, 10, QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) );
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainFrame w;
    w.resize(400,400);
    w.show();

    return a.exec();
}
如果没有垫片,其外观如下所示:

我讨厌这种显示,在更大的QWidget上,你的眼睛必须在widget周围寻找相关信息

使用垫片时,其外观如下所示:

我更喜欢它

有没有办法在不添加垫片的情况下进行此操作?添加这些参数是一件痛苦的事情,而且总是必须指定所有这些参数默认值并不能满足您的需要


我尝试使用QLayout::setSizeConstraint,但没有成功。似乎不打算这样做。

我将按以下方式进行:

[..]
theLayout->addStretch();
theLayout->addWidget( new QLabel( "A text", this ) );
theLayout->addWidget( new QPushButton( "A button", this ) );
theLayout->addStretch();
[..]

所以,基本上,你希望你的内容是固定大小的尽可能小,并在窗口的中心?根据您希望在窗口中显示的其他内容,最好使用具有动态大小的布局,即您的第一个屏幕截图,但根据默认设置,窗口应较小。如果用户愿意的话,应该能够将其放大以方便使用,否则最终会出现类似于“是否尝试过布局->添加小部件新建QLabel A文本”的结果,this,0,Qt::AlignHCenter;没有帮助?@leemes:问题是在用户操作后更改QWidget内容。窗口很大,显示了大量信息,然后,在用户操作关闭项目或其他任何您显示的信息较少的情况下,例如欢迎页面、QLabel+2打开/新建按钮或诸如此类的内容,但是窗口仍然很大—您不想更改它,它甚至可以被最大化!然后,窗口边框上的几个控件就丢失了,而不是集中在用户视图的中心。@Chernobyl:没有帮助,它使标签文本居中,但按钮仍然太大,控件没有居中……这样更好,但不会以我期望的显示结束……太好了!谢谢,再见!我本来希望有一个单行修复,一个直接在QLayout级别设置的属性,但是你的解决方案是绝对可以接受的。addStretch只是一个添加间隔符的方便函数方式。因此,这并不是完全的再见间隔;