Как замутить вот такие панели на Qt(Object Type, Name and Color etc.)?
помоему, QToolBox не подойдет, надо на основе дерева делать или QGroupBox
например так:
Та вот плохо, что не подойдет... Допустим сделаю я контрол на основе контейнеров и груп боксов... можно ли это потом как-нить встроить в QtDesigner? А то меня как-то не греет перспектива конструировать все это в коде...
есть два рианта:
1 создать модуль для дизайнера, на основе твоего класса (http://crossplatform.ru/documentation/qtdoc4.3/designer-creating-custom-widgets.php)
2 установить в дизайнере использование иного класса (http://crossplatform.ru/documentation/qtdoc4.3/designer-using-custom-widgets.php)
Ага, спс А как вобще этот контрол называется? Тот шо в 3ds max на скрине
не знаю, может у них самописаный
А где-нить в сети можно скачать виджеты для Qt? Может уже есть что-то подобное...
http://www.crossplatform.ru/?q=taxonomy/term/65
http://www.qt-apps.org/
http://www.qt-apps.org/
http://www.qt-prop.org
на них такого нет
есть еще такие
http://labs.trolltech.com
http://www.qtcentre.org/
на http://sourceforge.net ищи
Вот, кое-что нашел, индус накодил http://www.vcreatelogic.com/oss/qpulistview/index.html
да очень похоже на твой скриншот, одна беда портировать прийдется под Qt4 или разобратся как работает и сделать свой
Решил сделать по-своему. В QVBoxLayout толкаю парами QPushButton и QGroupBox. Разворачивается и сворачивается(просто по нажатию на кнопку прячу соответсвующий QGroupBox). Вышел косяк: при соврачивании какой-то одной группы, остальные автоматом растягиваются для занятия всей площади QVBoxLayout:
До:
ну ясен перец на то он и Layout, попробуя задавать sizePolicy для QGroupBox как fixed (по вертикали), после того как на толкаешь в них (QGroupBox) нужных виджетов и толко потом прятать/показывать.
Снизу добавь, спэйсер, когда будут исчезать QGroupBox'ы он будет всю систему подпирать с низу как пружинка
---
на заметку:
тот факт, что у тебя отступ накапливается, говорит о том, что спейсеров у тебя все больше и больше (т.е. они не удаляются)
Блин, ну и гемор с этим лейаутом...
Ладно, пока забил на корректировку размеров... может и на лейаут забью: сам буду тасовать
Фигня какая-то с размерами... надо бы подкорректировать размеры моего виджета под размеры предка. Пример:
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 в Layout'е лежит
у Layout'а способность регулировать толко от этого и завит что он меняет размер виджета, а иначеб он несмог работать
QFoldout это твой класс, от QWidget?
тогда тебе надо сделать рекомендуху для Layout'а в своем классе:
// Рекомендация размера, для Layout'ов
QSize QFoldout::sizeHint() const
{
return size();
}
Да, 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() );
}
О, после добавки QFoldout::sizeHint можно хотя бы вручную ресайзить...
пример от Макса Шлее:
main.cpp:
.
Так, новая запарка возникла
Вот код, добавляющий страницу в мой контрол:
void QFoldout::AddPage( const std::string& caption, QGroupBox *group )
{
QPushButton *button = new QPushButton( caption.c_str(), this );
connect( button, SIGNAL( clicked(bool) ), this, SLOT( OnCategoryButtonClicked(bool) ) );
button->setCheckable( true );
button->setChecked( true );
button->setVisible( true );
group->setVisible( true );
group->setParent( this );
categoryMap[ button ] = group;
buttonMap[ caption ] = button;
Layout();
}
void QFoldout::Layout( void )
{
tCategoryMapIter end = categoryMap.end();
int w = width();
int yOffset = 0;
const int k_ButtonHeight = 22;
const int k_ButtonOffset = 0;
for( tCategoryMapIter i = categoryMap.begin(); i != end; i++ ) {
QPushButton *button = i->first;
QGroupBox *group = i->second;
button->setGeometry( k_ButtonOffset, yOffset, w - k_ButtonOffset * 2, k_ButtonHeight );
group->setGeometry( 0, yOffset + k_ButtonHeight, w, group->height() );
if( button->isVisible() ) yOffset += k_ButtonHeight; // ** Вот тут собственно запарка, isVisible возвращает false
if( group->isVisible() ) yOffset += group->height(); // ** для QPushButton и для QGroupBox :(
}
resize( QSize( w, yOffset ) );
}
Думал, может у меня в коде какая-нить ошибка, написал:
QPushButton *button = new QPushButton( "Caption", this );
button->setVisible( true );
bool v = button->isVisible(); // ** Вот тут v = false
а кнопку видно?
Так, решил проблему переопределением QWidget::showEvent: вставил туда ф-цию QFoldout::Layout
обычно даже и не надо делать setVisible, уже видно должно быть, он случаем задом неперет не работает?
А хз. Не думаю Почитал щас доки, написано, что если кто-то из предков контрола не виден, то setVisible никакого эффекта не имеет... может по этому
запросто, т.к. родитель - контейнер.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)