LINUX.ORG.RU

[Qt]Размещение виджета в центре

 


0

1

Всем доброго времени суток.

Пытаюсь решить следующую проблему: есть виджет, в центре него должен распологатся один из виджетов в зависимости от внутреннего состояния приложения. Причем некоторые виджеты должны быть своих размеров (например QLabel), а некоторые виджеты должы быть размером с родительский виджет (например QTableWidget).

В данный момент пытаюсь организовать все это с помощью QLayout'ов. Ниже приведу 2 примера, как я это пытался сделать с пометками, что не получилось.

Собственно, прошу совета, как лучше организовать подобную схему.

Всем заранее спаисбо за советы.

★★★★★

Первый вариант, как я пытался это организовать:

mainWidget.h

class MainWidget : public QWidget
{
Q_OBJECT
private:
	QGridLayout *m_widgetsLayout;
public:
    explicit MainWidget(QWidget *parent = 0);
public slots:
	void addWidget(QWidget* wgt);
};

mainWidget.cpp

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent)
{
	QVBoxLayout *mainLayout = new QVBoxLayout();
	
	QWidget centerWidget = new QWidget();
	centerWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
	centerWidget->setObjectName("centerWidget");
	centerWidget->setStyleSheet("QWidget#centerWidget{background-color:blue;}");
	mainLayout->addWidget(centerWidget);
	
	m_widgetsLayout = new QGridLayout();
	centerWidget->setLayout(m_widgetsLayout);
	
	
	m_bottomWidget = new QLabel(tr("multifunctional panel"));
	m_bottomWidget->setStyleSheet("QLabel{background-color:red;}");
	m_bottomWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum);
	mainLayout->addWidget(m_bottomWidget);
	
	this->setLayout(mainLayout);
}


void MainWidget::addWidget(QWidget* wgt)
{
	m_widgetsLayout->addWidget(wgt,0,0,Qt::AlignCenter);
	
}

main.cpp

int main(int argc, char** argv)
{
	QApplication app(argc,argv);
	
	MainWidget* mainWidget = new MainWidget();
	QTableWidget *tbw = new QTableWidget(5,7);
	tbw->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
	mainWidget->addWidget(tbw);
	mainWidget->show();
	
	
	
	return app.exec();
}

В итоге tbw отображается в центре, но не растягивается на весь видежт.

trex6 ★★★★★
() автор топика

Вот второй вариант: mainWidget.h

class MainWidget : public QWidget
{
Q_OBJECT
private:
   QLayout *m_widgetsLayout;
public:
    explicit MainWidget(QWidget *parent = 0);
public slots:
   void addWidget(QWidget* wgt);
};

mainWidget.cpp

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent)
{
   QVBoxLayout *mainLayout = new QVBoxLayout();
   
   QWidget centerWidget = new QWidget();
   centerWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
   centerWidget->setObjectName("centerWidget");
   centerWidget->setStyleSheet("QWidget#centerWidget{background-color:blue;}");
   mainLayout->addWidget(centerWidget);
   
   QVBoxLayout *centerVLayout = new QVBoxLayout();
	centerVLayout->addStretch();
	
	QHBoxLayout *centerHLayout = new QHBoxLayout();
	centerHLayout->addStretch();
	
	
	m_widgetsLayout = new QVBoxLayout();
	centerHLayout->addLayout(m_widgetsLayout);
	
	centerHLayout->addStretch();
	
	centerVLayout->addLayout(centerHLayout);
	centerVLayout->addStretch();
	
	centerWidget->setLayout(centerVLayout);
   
   
   m_bottomWidget = new QLabel(tr("multifunctional panel"));
   m_bottomWidget->setStyleSheet("QLabel{background-color:red;}");
   m_bottomWidget->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum);
   mainLayout->addWidget(m_bottomWidget);
   
   this->setLayout(mainLayout);
}


void MainWidget::addWidget(QWidget* wgt)
{
   m_widgetsLayout->addWidget(wgt,0,0,Qt::AlignCenter);
   
}

main.cpp

int main(int argc, char** argv)
{
   QApplication app(argc,argv);
   
   MainWidget* mainWidget = new MainWidget();
   QTableWidget *tbw = new QTableWidget(5,7);
   tbw->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
   mainWidget->addWidget(tbw);
   mainWidget->show();
   
   
   
   return app.exec();
}

trex6 ★★★★★
() автор топика

Вот то, что у меня не получилось.
Документацию пробовал ритуально раскуривать, но ответов там так и не нашел. Буду благодарег за любые советы.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

Наверное, этот вариант мне тоже не подходит. QStackedLayout «растягивает» виджет на все поле, которое он занимет. Т.е. для него тоже необходимо придумать вариант, как разместить виджет по центру. К тому же много кода придется изменить в основном приложении.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

Господа, благодарю за проявленное участие.

Дело в том, что у меня как раз и возник вопрос, про центрирование одного виджета внутри другого. Как это правильно сделать.

Использование stackedWidget или show()/hide() в программе никак на это не влияет.

trex6 ★★★★★
() автор топика
Ответ на: У меня дежавю? от fat_angel

Не так давно была тема, по поводу использования QHBoxLayout->addStretch(), но там до каких-то конкретных идей не дошли. Да и другой немного вопрос там поднимался.

trex6 ★★★★★
() автор топика
Ответ на: У меня дежавю? от fat_angel

более того такие темы с регулярной периодичностью появляются на формуме developer.qt.nokia.com/forums.

irq
()

может я неправильно понял, а setCentralWidget(QWidget *) не устраивает?

было бы неплохо, если бы вы нарисовали то что хотите.

irq
()
Ответ на: комментарий от irq

setCentralWidget не работает для QWidget (ЕМНИП он только для MainWindow).

По поводу проблемы - все очень просто. Хочу, чтоб я мог добавить для элемента виджет, этот виджет мог бы растягиватся/не растягиватся на всю ширину/высоту родителя и располагался бы в центре.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Ну там есть пример центрирование виджетов, допилил бы сам:

QStackedWidget *stacked_widget = new QStackedWidget(this);

// этот виджет растягиваться не будет, будет центрирован по вертикали
QWidget *centered_widget = new QWidget;
MyWidget *my_widget = new MyWidget(centered_widget);
QVBoxLayout *main_layout = new QVBoxLayout(centered_widget);
main_layout->addStretch();
main_layout->addWidget(my_widget);
main_layout->addStretch();
stacked_widget->addWidget(centered_widget);

Можно как угодно центрировать, растягивать, не центрировать, тащемта.

Obey-Kun ★★★★★
()
Ответ на: комментарий от trex6

Хорошо, а чем не устраивает вариант хранить например Q{Shared, Scoped}Pointer<QWidget> внутри себя, выставить ему нужную sizePolicy и по мере надобности переопределять его?

irq
()
Ответ на: комментарий от Obey-Kun

Как раз подобный вариант я пробую использовать во втором примере.
Я, конечно, понимаю, что выкладывать сюда простыни кода было глупо. Я и сам такое никогда не читаю. ;-)

trex6 ★★★★★
() автор топика
Ответ на: комментарий от irq

Не очень понял Вашу идею.
Можно поподробнее?

trex6 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.