Разворачивающиеся панели, как в 3ds Max(скрин прилагаеццо :) ) |
Здравствуйте, гость ( Вход | Регистрация )
Разворачивающиеся панели, как в 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 |
Блин, ну и гемор с этим лейаутом...
Ладно, пока забил на корректировку размеров... может и на лейаут забью: сам буду тасовать Фигня какая-то с размерами... надо бы подкорректировать размеры моего виджета под размеры предка. Пример:
Даже после 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'а в своем классе:
Сообщение отредактировал 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):
И вот такой конструктор:
В итоге никакие ресайзы не помагают: размер 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 |
|
|
Текстовая версия | Сейчас: 6.1.2025, 3:46 |