0

ここ数日間、私は Qt レイアウト システムに関する特定の問題を解決しようとしています。一般化してみましょう: 2 つの行を持つウィジェットがあります。最初の行には、ツリー ボタン (またはその他のコントロール) があります。それらのレイアウトは写真に示されています: ここに画像の説明を入力

中央のボタンは、使用可能なすべての余分なスペースを使用しています (ウィジェットのサイズが大きくなるにつれて拡大します)。問題は、プログラムで中央のウィジェット(ボタン)のサイズを変更し、レイアウトを維持したいということです。現在の実装では、中央のボタンのサイズを変更すると、次のようになります。

ここに画像の説明を入力

右ボタンを中央ボタンの右側に配置したい(余分なスペースなし)。ウィジェットのサイズを変更すると、位置 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() );
}

ノート:

中央と右のウィジェット Qt::AlignLeft を揃えようとしましたが、結果はありません。実際、ウィジェットをレイアウトに残して配置すると、拡張機能が壊れる最小サイズを取得しようとします:(

参照が必要な場合は、コードを共有しました: https://drive.google.com/file/d/0B-mc4aKkzWlxTWdNNmpuQ0ptQ3M/edit?usp=sharing

私の投稿を読んでくれてありがとう、あなたが解決策を知っていることを願っています:)

4

3 に答える 3

0

中央のウィジェットの最大サイズを設定する必要があります。適切なウィジェットを適応させるには、中央のウィジェットのサイズを変更するときに、そのサイズ ポリシーを 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 );
}

または、中央のウィジェットのサイズを手動で変更する場合 (上記のコメンターが指摘したように非推奨です)、右側のウィジェットのジオメトリも手動で更新する必要があります。次に、decrementメソッドは次のようになります

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() );
    int rightPosX = m_center->pos().x() + m_center->width() + m_firstRowLayout->spacing ();
    int rightWidth = centralWidget()->pos().x() + centralWidget()->width() - m_mainLayout->margin() - rightPosX;
    m_right->setGeometry (rightPosX, m_right->pos().y(), rightWidth, m_right->height());
}

この場合、レイアウトがデフォルトの縦横比を復元しようとするため、サイズ変更時にカスタム サイズも更新する必要があります。

于 2014-01-20T12:07:21.440 に答える
0

それが悪い考えかどうかはわかりません。

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

このように、ストレッチはすべてのボタンを左に押します

于 2018-09-08T07:56:54.527 に答える