Название: Spacing & QStackWidget
Отправлено: yuraborodin от Ноября 13, 2010, 21:03
Доброе время суток. Есть стек виджетов. В стек пихаю виджеты Widget1,Widget2,...WidgetN. Высота у этих виджетов разная. По выбору элемента в ComboBox меняется текущий виджет на другой из стека с номером соотвествующий выбранному в комбобоксе. Отображаемый виджет имеет максимальную высоту из всех виджетов в стеке виджетов, и эелменты на виджете далеко отстоят друг от друга. Прытался поставить setSpacing - никакого эффекта. Как решить? спасибо.
Название: Re: Spacing & QStackWidget
Отправлено: BRE от Ноября 13, 2010, 21:09
Если я тебя правильно понял, посмотри на: QSpacerItem
ну и Horizontal/Vertical spacer в дизайнере.
Название: Re: Spacing & QStackWidget
Отправлено: yuraborodin от Ноября 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);
Где я просчитался?
Название: Re: Spacing & QStackWidget
Отправлено: yuraborodin от Ноября 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(); }
|