crossplatform.ru

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


  Ответ в Разворачивающиеся панели
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 20.3.2008, 22:58
  запросто, т.к. родитель - контейнер.
0xF Дата 20.3.2008, 22:00
  А хз. Не думаю :) Почитал щас доки, написано, что если кто-то из предков контрола не виден, то setVisible никакого эффекта не имеет... может по этому
Litkevich Yuriy Дата 20.3.2008, 21:29
  обычно даже и не надо делать setVisible, уже видно должно быть, он случаем задом неперет не работает? :)
0xF Дата 20.3.2008, 21:26
 
Цитата
а кнопку видно?

Нет, она не появлялась... т.е. просто пустой виджет без кнопок и групп
0xF Дата 20.3.2008, 21:25
  Так, решил проблему переопределением QWidget::showEvent: вставил туда ф-цию QFoldout::Layout
Litkevich Yuriy Дата 20.3.2008, 21:25
  а кнопку видно?
0xF Дата 20.3.2008, 21:09
  Думал, может у меня в коде какая-нить ошибка, написал:
QPushButton *button = new QPushButton( "Caption", this );

button->setVisible( true );
bool v = button->isVisible(); // ** Вот тут v = false

WTF?!! :wacko: Чо за фигня? :blink:
0xF Дата 20.3.2008, 16:57
  Так, новая запарка возникла :)
Вот код, добавляющий страницу в мой контрол:
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();
}


И ф-ция 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 ) );
}


Прошелся дебагером по коду: сразу же после вставки страницы вызывается ф-ция Layout(см. код), но метод isVisible почему-то возвращает false, хотя я вызвал в коде вставки страницы button->setVisible( true ) и group->setVisible( true )

Почему isVisible возвращает false? О_о
0xF Дата 18.3.2008, 0:17
  .
Litkevich Yuriy Дата 17.3.2008, 23:02
  пример от Макса Шлее:
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);
}


он жестко задал размер
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 18:03