Russian Qt Forum

Qt => Вопросы новичков => Тема начата: DenisMoskvin от Июнь 08, 2017, 13:48



Название: Расположение виджетов на QStacketWidget
Отправлено: DenisMoskvin от Июнь 08, 2017, 13:48
Всем привет! Подскажите пожалуйста как располагать элементы на QStackedWidget. Мне необходимо расположить группу виджетов на каждой страничке QStackedWidget и делаю это я подобным образом:

Код
C++ (Qt)
#include "mainwindow.h"
 
#include "ui_mainwindow.h"
 
#include <QBoxLayout>
 
#include <QLineEdit>
 
#include <QString>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QVBoxLayout *lay1 = new QVBoxLayout ();
   lay1->addWidget(new QLineEdit (QString ("LineEdit11")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit12")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit13")));
 
   QVBoxLayout *lay2 = new QVBoxLayout ();
   lay1->addWidget(new QLineEdit (QString ("LineEdit21")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit22")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit23")));
 
 
   page=lay1->widget()); // 1ая страница QStackedWidget
   page_2=lay2->widget()); // 2ая страница QStackedWidget
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 

Но программа завершается ошибкой из-за того что lay1->widget() возвращает NULL. Почему ? Он разве не наследник от QWidget ? Или как осуществить мою задумку ?


Название: Re: Расположение виджетов на QStacketWidget
Отправлено: Apktyc от Июнь 08, 2017, 13:58
Не замечен код привязки компановщика к виджету.
Код:
setLayout(lay1);

У Вас сейчас просто есть компоновщики с виджетами, которые не принадлежат ничему.


Название: Re: Расположение виджетов на QStacketWidget
Отправлено: DenisMoskvin от Июнь 08, 2017, 14:29
Торопился, немного ошибся в примере,но сейчас  немного разобрался. Сделал примерно вот так:

Код
C++ (Qt)
#include "mainwindow.h"
 
#include "ui_mainwindow.h"
 
#include <QBoxLayout>
 
#include <QLineEdit>
 
#include <QString>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QVBoxLayout *lay1 = new QVBoxLayout (ui->page);
   lay1->addWidget(new QLineEdit (QString ("LineEdit11")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit12")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit13")));
 
   QVBoxLayout *lay2 = new QVBoxLayout (ui->page);
   lay2->addWidget( new QLineEdit (QString ("LineEdit21")));
   lay2->addWidget(new QLineEdit (QString ("LineEdit22")));
   lay2->addWidget( new QLineEdit (QString ("LineEdit23")));
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}

Желаемого эффекта добился, но при отладке появилось сообщение :

Отладка запущена
QLayout: Attempting to add QLayout "" to QWidget "page", which already has a layout
Отладка завершена


Т.е я пытаюсь добавить  QVBoxLayout на ui-> page который уже имеет QLayout, но меняя код таким образом (не создавая для каждой страницы Layout), на странице я вижу последний добавленный элемент. Код такой :

Код
C++ (Qt)
#include "mainwindow.h"
 
#include "ui_mainwindow.h"
 
#include <QBoxLayout>
 
#include <QLineEdit>
 
#include <QString>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
 
 
  QLineEdit *le1=new QLineEdit (QString ("LineEdit11"),ui->page);
  QLineEdit *le2=new QLineEdit (QString ("LineEdit12"),ui->page);
  QLineEdit *le3=new QLineEdit (QString ("LineEdit13"),ui->page);
 
 
   QLineEdit *le4 = new QLineEdit (QString ("LineEdit21"),ui->page_2);
   QLineEdit *le5 = new QLineEdit (QString ("LineEdit22"),ui->page_2);
   QLineEdit *le6 = new QLineEdit (QString ("LineEdit23"),ui->page_2);
 
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 


Название: Re: Расположение виджетов на QStacketWidget
Отправлено: Apktyc от Июнь 08, 2017, 14:43
В первом варианте, Вы оба компоновщика создаете для ui->page, отсюда и ошибка.
Во-втором варианте, Вы свои виджеты создаете на разных страницах (?) , но они просто попадают в одну точку - поэтому видно только последний.



Название: Re: Расположение виджетов на QStacketWidget
Отправлено: DenisMoskvin от Июнь 08, 2017, 14:50
а, да спасибо! банальная невнимательность. Вот итоговый пример:

Код
C++ (Qt)
#include "mainwindow.h"
 
#include "ui_mainwindow.h"
 
#include <QBoxLayout>
 
#include <QLineEdit>
 
#include <QString>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
 
   QVBoxLayout *lay1 = new QVBoxLayout (ui->page);
   lay1->addWidget(new QLineEdit (QString ("LineEdit11")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit12")));
   lay1->addWidget(new QLineEdit (QString ("LineEdit13")));
 
   QVBoxLayout *lay2 = new QVBoxLayout ([b]ui->page_2[/b]);
   lay2->addWidget( new QLineEdit (QString ("LineEdit21")));
   lay2->addWidget(new QLineEdit (QString ("LineEdit22")));
   lay2->addWidget( new QLineEdit (QString ("LineEdit23")));
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 


Название: Re: Расположение виджетов на QStacketWidget
Отправлено: gil9red от Июнь 08, 2017, 14:53
DenisMoskvin, оборачивайте код в тег code
В сообщении это комбобокс с текстом С++ (Qt)


Название: Re: Расположение виджетов на QStacketWidget
Отправлено: DenisMoskvin от Июнь 08, 2017, 15:49
Ок, хорошо. Спасибо