Russian Qt Forum
Декабрь 23, 2024, 04:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Spacing & QStackWidget  (Прочитано 5986 раз)
yuraborodin
Гость
« : Ноябрь 13, 2010, 21:03 »

Доброе время суток.
Есть стек виджетов.
В стек пихаю виджеты Widget1,Widget2,...WidgetN.
Высота у этих виджетов разная.
По выбору элемента в ComboBox меняется текущий виджет на другой из стека с номером соотвествующий выбранному в комбобоксе.
Отображаемый виджет имеет максимальную высоту из всех виджетов в стеке виджетов, и эелменты на виджете далеко отстоят друг от друга.
Прытался поставить setSpacing - никакого эффекта.
Как решить?
спасибо.
Записан
BRE
Гость
« Ответ #1 : Ноябрь 13, 2010, 21:09 »

Если я тебя правильно понял, посмотри на:
QSpacerItem

ну и Horizontal/Vertical spacer в дизайнере.
Записан
yuraborodin
Гость
« Ответ #2 : Ноябрь 13, 2010, 22:15 »

Если я тебя правильно понял, посмотри на:
QSpacerItem

Получилось воть что - смотрим вложение.
Не имею возможности даже вручную(мышкой) изменить размеры 1,2 и 4 окна.
Сombobox и кнопки Add, Close не входят в виджет, который в стеке виджетов.
виджетом является QGridLayout
пример кода для Хост виджета:

Код:
  GridLayout= new QGridLayout;
    label = new QLabel(trUtf8("Имя узла"));
    txtHost = new QLineEdit;
    spacer=new QSpacerItem(0,0,QSizePolicy::Minimum,QSizePolicy::Minimum);
    GridLayout->addWidget(label,0,0);   
    GridLayout->addWidget(txtHost,0,1);
    GridLayout->addItem(spacer,1,0,1,1);
    label = new QLabel(trUtf8("IP адрес"));
    txtIP = new QLineEdit;
    GridLayout->addWidget(label,2,0);
    GridLayout->addWidget(txtIP,2,1);
    spacer=new QSpacerItem(0,0,QSizePolicy::Minimum,QSizePolicy::Fixed);
    GridLayout->addItem(spacer,3,0,3,1);
    HostWidget->setLayout(GridLayout); 
....
//стек виджетов
   //add pages to layout stack
    laystck = new QStackedLayout;
    laystck->addWidget(HostWidget);
    laystck->addWidget(ServiceWidget);
    laystck->addWidget(FactWidget);
    laystck->addWidget(SoluteWidget); 
...
layout = new QVBoxLayout;   
    layout->addWidget(combo);
    layout->addLayout(laystck);
    layout->addWidget(bAdd);
    layout->addWidget(bClose);
    setLayout(layout);


Где я просчитался?
Записан
yuraborodin
Гость
« Ответ #3 : Ноябрь 14, 2010, 02:12 »

Всем спасибо - нашел решение здесь (http://developer.qt.nokia.com/faq/answer/how_can_i_get_a_qstackedwidget_to_automatically_switch_size_depending_on_th)

Цитировать
How can I get a QStackedWidget to automatically switch size depending on the content of the page?

When having a QStackedWidget that contains pages that you want to display in different sizes, then QStackWidget can adjust its size automatically when switching pages if you follow these steps:
– set the size policy of the invisible pages to ignored – set the size policy of the page that is going to be visible to e.g preferred – call adjustSize() in order to adjust the size to the sizeHint().

The following article in Qt Quarterly demonstrates how this can be done. It is written for Qt 3, but the concept remains the same for Qt 4:

http://doc.qt.nokia.com/qq/qq06-qwidgetstack.html

The example below demonstrates how this can be done:

Код:
#include <QtGui>
class SubWidget : public QWidget
{
  Q_OBJECT
public:
  SubWidget(QWidget *parent) : QWidget(parent)
  {
    table = new QTableWidget(this);
    table->setColumnCount(10);
    table->setRowCount(10);
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(table);
         
  }
  QSize minimumSizeHint () const
  {
    int newWidth = 0;
    int newHeight =0;
    for (int i = 0; i < table->columnCount(); i++) {
      newWidth+= table->columnWidth(i);
    }
    for (int y = 0; y < table->rowCount(); y++) {
      newHeight+= table->rowHeight(1);
    }
    newWidth+= table->verticalHeader()->width() + 2 *table->frameWidth();
          newHeight+= table->horizontalHeader()->height() +2 *table->frameWidth();
          return QSize(newWidth, newHeight);
  }
private:
  QTableWidget *table;
};
 
class Widget : public QWidget
{
  Q_OBJECT
public:
  Widget() : QWidget()
  {
    QPushButton *firstButton = new QPushButton("Open second page", this);
    QPushButton *secondButton = new QPushButton("Open first page", this);
    stackWidget = new QStackedWidget(this);
 
    SubWidget *firstPage = new SubWidget(stackWidget);
 
    QWidget *secondPage = new QWidget(stackWidget);
    QLineEdit *edit2 = new QLineEdit(secondPage);
    QVBoxLayout *secondPageLayout = new QVBoxLayout(secondPage);
    secondPageLayout->addWidget(edit2);
 
    stackWidget->addWidget(firstPage);
    stackWidget->addWidget(secondPage);
 
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(secondButton);
    layout->addWidget(firstButton);
    layout->addWidget(stackWidget);
 
    connect(firstButton, SIGNAL(clicked()), this, SLOT(test1()));
    connect(secondButton, SIGNAL(clicked()), this, SLOT(test2()));
 
  }
  public slots:
    void test1()
    {
      changeCurrent(1);
    }
 
    void test2()
    {
      changeCurrent(0);
    }
private:
        void changeCurrent(int idx)
        {
               if (stackWidget->currentWidget() !=0) {
      stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
      }
      stackWidget->setCurrentIndex(idx);
      stackWidget->currentWidget()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
      adjustSize();
        }
  QStackedWidget *stackWidget;
};
 
#include "main.moc"
 
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  Widget window;
  window.show();
  return app.exec();
 
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 21.