crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Разворачивающиеся панели, как в 3ds Max(скрин прилагаеццо :) )
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 20:19
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


да очень похоже на твой скриншот, одна беда портировать прийдется под Qt4 или разобратся как работает и сделать свой

Сообщение отредактировал Litkevich Yuriy - 17.3.2008, 20:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.3.2008, 21:57
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Решил сделать по-своему. В QVBoxLayout толкаю парами QPushButton и QGroupBox. Разворачивается и сворачивается(просто по нажатию на кнопку прячу соответсвующий QGroupBox). Вышел косяк: при соврачивании какой-то одной группы, остальные автоматом растягиваются для занятия всей площади QVBoxLayout:
До:
Прикрепленное изображение

После(открытые группы растянулись):
Прикрепленное изображение

Ещё бы можно было как-то пережить, если бы не вот такая фигня при отсутствии открытых групп:
Прикрепленное изображение


Нашел у QVboxLayout метод addSpacing, при закрытии группы добавляю отступ равный высоте QGroupBox, при открытии вычитаю... но тут тоже косяк, если много раз открыть-закрыть какую-то группу, то отсуп накапливается и выходит вот такая фигня(красным обозначен накопленный левый отсутп):
Прикрепленное изображение


Может забить на QVBoxLayout? Но тогда надо будет каждый раз вручную тасовать все QGroupBox & QPushButton...

Any ideas? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 22:03
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ну ясен перец на то он и Layout, попробуя задавать sizePolicy для QGroupBox как fixed (по вертикали), после того как на толкаешь в них (QGroupBox) нужных виджетов и толко потом прятать/показывать.
Снизу добавь, спэйсер, когда будут исчезать QGroupBox'ы он будет всю систему подпирать с низу как пружинка

---
на заметку:
тот факт, что у тебя отступ накапливается, говорит о том, что спейсеров у тебя все больше и больше :) (т.е. они не удаляются)

Сообщение отредактировал Litkevich Yuriy - 17.3.2008, 22:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.3.2008, 22:31
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Блин, ну и гемор с этим лейаутом...
Ладно, пока забил на корректировку размеров... может и на лейаут забью: сам буду тасовать :)

Фигня какая-то с размерами... надо бы подкорректировать размеры моего виджета под размеры предка. Пример:
QDockWidget *foldDock = new QDockWidget( "Foldout", this );

QFoldout *foldOut = new QFoldout( foldDock ); // ** Мой виджет

foldDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
foldDock->setWidget( foldOut );

addDockWidget( Qt::RightDockWidgetArea, foldDock );

foldOut->resize( foldDock->size() );

Даже после foldOut->resize ничо не изменилось... width = 100, height = 30 :( Почему?? Ведь само окошко (foldDock) куда больше чем 100х30(см. скрины выше)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 22:38
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


попробую угадать с закрытыми глазами:
foldOut в Layout'е лежит
у Layout'а способность регулировать толко от этого и завит что он меняет размер виджета, а иначеб он несмог работать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 22:41
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


QFoldout это твой класс, от QWidget?

тогда тебе надо сделать рекомендуху для Layout'а в своем классе:
// Рекомендация размера, для Layout'ов
QSize QFoldout::sizeHint() const
{
    return size();
}


Сообщение отредактировал Litkevich Yuriy - 17.3.2008, 22:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.3.2008, 22:52
Сообщение #17


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да, QFoldout - мой класс от QWidget, QVBoxLayout я пока убрал и кидаю кнопки прям в него(QFoldout):
void QFoldout::AddGroup( const std::string caption )
{
    QPushButton *button = new QPushButton( caption.c_str(), this );
    QGroupBox *group    = new QGroupBox( this );

    connect( button, SIGNAL( clicked(bool) ), this, SLOT( OnCategoryButtonClicked(bool) ) );

    button->setCheckable( true );
    button->setChecked( true );
}


И вот такой конструктор:
QFoldout::QFoldout( QWidget *parent ) : QWidget( parent ) {
    if( parent ) resize( parent->size() );
}


В итоге никакие ресайзы не помагают: размер 100х30... Вобще ресайз не работает... ни для моего QFoldout, ни для ихнего QDockWidget :(

Сообщение отредактировал 0xF - 17.3.2008, 22:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 17.3.2008, 22:58
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


О, после добавки QFoldout::sizeHint можно хотя бы вручную ресайзить...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.3.2008, 23:02
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


пример от Макса Шлее:
main.cpp:
CODE

#include <QtGui>
#include "CustomWidget.h"

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QWidget wgt;

CustomWidget* pcw = new CustomWidget;
QScrollBar* phsb = new QScrollBar(Qt::Horizontal);

phsb->setRange(0, 100);

QObject::connect(phsb, SIGNAL(valueChanged(int)),
pcw, SLOT(slotSetProgress(int))
);

//Layout setup
QVBoxLayout* pvbxLayout = new QVBoxLayout;
pvbxLayout->addWidget(pcw);
pvbxLayout->addWidget(phsb);
wgt.setLayout(pvbxLayout);

wgt.show();

return app.exec();
}

CustomWidget.h:
CODE

#ifndef _CustomWidget_h_
#define _CustomWidget_h_

#include <QFrame>

// ======================================================================
class CustomWidget : public QFrame {
Q_OBJECT
protected:
int m_nProgress;

virtual void paintEvent(QPaintEvent*);

public:
CustomWidget(QWidget* pwgt = 0);

virtual QSize sizeHint() const;

signals:
void progressChanged(int);

public slots:
void slotSetProgress(int n);
};
#endif //_CustomWidget_h_

CustomWidget.cpp:
CODE

#include <QtGui>
#include "CustomWidget.h"

// ----------------------------------------------------------------------
CustomWidget::CustomWidget(QWidget* pwgt/*= 0*/) : QFrame(pwgt)
, m_nProgress(0)
{
setLineWidth(3);
setFrameStyle(Box | Sunken);

setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
}

// ----------------------------------------------------------------------
/*virtual*/ void CustomWidget::paintEvent(QPaintEvent*)
{
QPainter painter(this);
QLinearGradient gradient(0, 0, width(), height());
float f = m_nProgress / 100.0f;

gradient.setColorAt(0, Qt::black);
gradient.setColorAt(f, Qt::green);

painter.fillRect(rect(), Qt::black);
painter.setBrush(gradient);
painter.drawRect(0, 0, (int)(width() * f), height());

painter.setPen(QPen(Qt::green));
QString str = QString().setNum(m_nProgress) + "%";
painter.drawText(rect(), Qt::AlignCenter, str);

drawFrame(&painter);
}

// ----------------------------------------------------------------------
void CustomWidget::slotSetProgress(int n)
{
m_nProgress = n > 100 ? 100 : n < 0 ? 0 : n;
repaint();
emit progressChanged(m_nProgress);
}

// ----------------------------------------------------------------------
/*virtual*/ QSize CustomWidget::sizeHint() const
{
return QSize(200, 30);
}


он жестко задал размер

Сообщение отредактировал Litkevich Yuriy - 17.3.2008, 23:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
0xF
  опции профиля:
сообщение 18.3.2008, 0:17
Сообщение #20


Студент
*

Группа: Участник
Сообщений: 71
Регистрация: 12.11.2007
Пользователь №: 20

Спасибо сказали: 0 раз(а)




Репутация:   0  


.

Сообщение отредактировал 0xF - 18.3.2008, 0:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 9:21