Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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/7.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++ Qt在布局中排列ltems_C++_Qt_User Interface_Qlayout - Fatal编程技术网

C++ Qt在布局中排列ltems

C++ Qt在布局中排列ltems,c++,qt,user-interface,qlayout,C++,Qt,User Interface,Qlayout,在过去的几天里,我试图解决Qt布局系统的一个特殊问题。我试着概括一下: 我有一个两行的小部件。第一行有树按钮(或任何其他控件)。其布局如图所示: 中心按钮占用了所有可用的额外空间(并且随着小部件的增大而扩展)。问题是,我希望通过编程调整中心小部件(按钮)的大小并维护布局。在我当前的实现中,当我调整中心按钮的大小时,会发生以下情况: 我希望右按钮在中间按钮的右侧对齐(没有额外的空间)。现在,当我调整小部件的大小时,它会返回到位置1(中心占据了所有额外的空间),但这不是我想要的效果 以下是我当前

在过去的几天里,我试图解决Qt布局系统的一个特殊问题。我试着概括一下: 我有一个两行的小部件。第一行有树按钮(或任何其他控件)。其布局如图所示:

中心按钮占用了所有可用的额外空间(并且随着小部件的增大而扩展)。问题是,我希望通过编程调整中心小部件(按钮)的大小并维护布局。在我当前的实现中,当我调整中心按钮的大小时,会发生以下情况:

我希望右按钮在中间按钮的右侧对齐(没有额外的空间)。现在,当我调整小部件的大小时,它会返回到位置1(中心占据了所有额外的空间),但这不是我想要的效果

以下是我当前的实现:

#include "Widget_Old.h"

#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>

WidgetOld::WidgetOld(QWidget *parent) :
    QWidget(parent)
{
    QVBoxLayout* mainLayout = new QVBoxLayout( this );

    QWidget* firstRowWidget = new QWidget( this );

    QPushButton* left   = new QPushButton;
    left->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );
    left->setText( "left" );

    m_center = new QPushButton;
    m_center->setText( "centerr");
    m_center->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );

    QPushButton* right  = new QPushButton;
    right->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );
    right->setText( "right" );

    QHBoxLayout* firstRowLayout = new QHBoxLayout( firstRowWidget );

    firstRowLayout->addWidget( left );
    firstRowLayout->addWidget( m_center );
    firstRowLayout->addWidget( right );

    QHBoxLayout* secondRowLayout = new QHBoxLayout;
    QPushButton* button = new QPushButton( "resize" );
    connect( button, SIGNAL(clicked()), SLOT(decrement()) );
    secondRowLayout->addWidget( button );

    mainLayout->addWidget( firstRowWidget  );
    mainLayout->addLayout( secondRowLayout );
}

WidgetOld::~WidgetOld()
{
}


void WidgetOld::decrement()
{
    qDebug() << "Changing width from " << m_center->width() << " to " << m_center->width()/2;
    m_center->resize( m_center->width()/2, m_center->height() );
}
#包括“Widget_Old.h”
#包括
#包括
#包括
#包括
WidgetOld::WidgetOld(QWidget*父项):
QWidget(父级)
{
QVBoxLayout*mainLayout=新的QVBoxLayout(此);
QWidget*firstRowWidget=新的QWidget(此);
QPushButton*左=新的QPushButton;
左->设置策略(QSizePolicy::最大,QSizePolicy::首选);
左->设置文本(“左”);
m_中心=新的QPUSH按钮;
m_center->setText(“center”);
m_center->setSizePolicy(QSizePolicy::Expansing,QSizePolicy::Preferred);
QPushButton*右=新的QPushButton;
右->设置策略(QSizePolicy::Maximum,QSizePolicy::Preferred);
右->设置文本(“右”);
QHBoxLayout*firstRowLayout=新的QHBoxLayout(firstRowWidget);
firstRowLayout->addWidget(左);
firstRowLayout->addWidget(m_center);
firstRowLayout->addWidget(右);
QHBoxLayout*secondRowLayout=新的QHBoxLayout;
QPushButton*按钮=新的QPushButton(“调整大小”);
连接(按钮、信号(点击())、插槽(减量());
secondRowLayout->addWidget(按钮);
mainLayout->addWidget(firstRowWidget);
主布局->添加布局(第二行布局);
}
WidgetOld::~WidgetOld()
{
}
void WidgetOld::decrement()
{
qDebug()宽度()/2,m_中心->高度();
}
注:

我尝试过对齐中心和右窗口小部件Qt::AlignLeft,但没有结果。实际上什么时候 将小部件左对齐在布局中,它尝试采用最小尺寸,这会破坏扩展功能:(

如果需要任何参考,我已经分享了我的代码:


感谢您阅读我的文章,希望您了解解决方案:)

当您使用版面时,您将管理大小的责任转移到版面上,因此您永远不应该在版面中手动调整项目的大小

试试这个:

WidgetOld::WidgetOld(QWidget *parent) :
    QWidget(parent)
{
    QVBoxLayout* mainLayout = new QVBoxLayout( this );

    QWidget* firstRowWidget = new QWidget( this );

    QPushButton* left   = new QPushButton;
    left->setText( "left" );
    left->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );

    m_center = new QPushButton;
    m_center->setText( "centerr");
    m_center->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );

    QPushButton* right  = new QPushButton;
    right->setText( "right" );
    right->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred );

    QHBoxLayout* firstRowLayout = new QHBoxLayout( firstRowWidget );

    firstRowLayout->addWidget( left );
    firstRowLayout->addStretch();
    firstRowLayout->addWidget( m_center );
    firstRowLayout->addStretch();
    firstRowLayout->addWidget( right );

    QHBoxLayout* secondRowLayout = new QHBoxLayout;
    QPushButton* button = new QPushButton( "resize" );
    connect( button, SIGNAL(clicked()), SLOT(decrement()) );
    secondRowLayout->addWidget( button );

    mainLayout->addWidget( firstRowWidget  );
    mainLayout->addLayout( secondRowLayout );
}

您必须设置中心小部件的最大大小。要使正确的小部件适应,请在调整中心小部件的大小时,将其大小策略设置为MinimumExpanding:

void WidgetOld::decrement ()
{
    qDebug() << "Changing width from " << m_center->width() << " to " << m_center->width()/2;
    m_center->setMaximumWidth (m_center->width()/2);
    m_right->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
}

在这种情况下,您还应该在调整大小时更新自定义尺寸,因为布局将尝试恢复默认比例。

我不知道这是否是个坏主意

是否可以将firstRowLayout设置为全局布局,然后在decrement()SLOT函数的末尾向布局动态添加拉伸

void WidgetOld::decrement(){
    qDebug() << "Changing width from " << m_center->width() << " to " << m_center->width()/2;
    m_center->resize( m_center->width()/2, m_center->height() );
    firstRowLayout->addStretch(1);
}
void WidgetOld::decrement(){
qDebug()宽度()/2,m_中心->高度();
firstRowLayout->addStretch(1);
}

这样,拉伸会将所有按钮按到左侧

感谢您的快速回复,但这并没有真正起作用。我认为拉伸实际上增加了按钮之间的间距,我希望它们绑在一起:)关于不重新调整自定义小部件大小的规则,你对如何使用另一种方法解决问题有什么想法吗?也许我不明白你想实现什么。我认为中间按钮应该与其他按钮的间距居中。如果您需要其他组合,只需将拉伸放在不同的位置(您需要空间的地方)。我会在最后一个按钮后添加拉伸,这应该会起作用。但当我增加中央按钮的大小时,右边的按钮没有移动,它的几何图形应该手动更新。请再次阅读我答案的第一句话。例如,您可以通过更改minimum
minimumWidth
来强制不同的大小。实际上,使用第一种方法时,右按钮将保留在左侧,但也会增加其大小。我想如果我想保持右按钮的大小,我应该在最后一个按钮后添加一个拉伸?那么您希望右小部件保持其大小,以便在调整中央小部件的大小时,右边有空白?在这种情况下,您不需要在
WidgetOld::decrement
中设置大小策略,而是添加
firstRowLayout->setAlignment(Qt::AlignLeft)
void WidgetOld::decrement(){
    qDebug() << "Changing width from " << m_center->width() << " to " << m_center->width()/2;
    m_center->resize( m_center->width()/2, m_center->height() );
    firstRowLayout->addStretch(1);
}