crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Не удается применить QSplitter->setSizes()
novichkov
  опции профиля:
сообщение 31.3.2011, 18:42
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 64
Регистрация: 20.3.2008
Из: Северодвинск
Пользователь №: 128

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




Репутация:   1  


Я пытаюсь сделать так, чтобы по двойному щелчку по QSplitterHandle нижний виджет подгонял свой размер под содержимое.

Я переопределил классы:

Класс SplitterHandle посылает сигнал при двойном щелчке по нему
class SplitterHandle : public QSplitterHandle
{
    Q_OBJECT
public:
    SplitterHandle(Qt::Orientation orientation, QSplitter *parent = 0)
        : QSplitterHandle(orientation,parent) {    }
signals:
    void adjustSizeRequested();
protected:
    void mouseDoubleClickEvent(QMouseEvent * e) {
        if (e->button()==Qt::LeftButton) emit adjustSizeRequested();
    }
};


Класс Splitter передает сигнал дальше
class Splitter : public QSplitter
{
    Q_OBJECT
public:
    Splitter(Qt::Orientation orientation, QWidget *parent = 0)
        : QSplitter(orientation,parent) {   }
signals:
    void adjustSizeRequested();
protected:
    QSplitterHandle *createHandle() {
        SplitterHandle *h=new SplitterHandle(orientation(), this);
        connect(h,SIGNAL(adjustSizeRequested()),this,SIGNAL(adjustSizeRequested()));
        return h;
    }
};


Затем при создании сплиттера я подсоединяю его сигнал к слоту:
sp = new Splitter(Qt::Vertical,this);
sp->addWidget(tree);
sp->addWidget(table);
sp->setContentsMargins(5,5,5,5);
sp->restoreState(settings->splitterState());
connect(sp,SIGNAL(adjustSizeRequested()),this,SLOT(adjustTableSize()));


Сам слот:
Он подгоняет высоту QTableWidget *table так, чтобы не было видно вертикальной полосы прокрутки,
то есть его высота равнялась высоте одной строки, помноженной на количество строк.
void Tab::adjustTableSize()
{
    int tableHeight=table->contentsRect().height();
    int rowsHeight = table->visualItemRect(table->item(0,0)).height()*
                     table->rowCount();
    if ((tableHeight-rowsHeight < 15) || (tableHeight-rowsHeight >= 20)) {
        int H=sp->contentsRect().height();
        int h=sp->handleWidth();
        int h2=rowsHeight+15+2;
        if (H-h-h2>50) sp->setSizes(QList<int>() << H-h-h2 <<h2);
    }
}


Эта функция "почти" работает - высота таблицы меняется на мгновение, но затем разделитель сплиттера прыгает обратно. Как это можно вылечить? В чем тут вообще может быть дело?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 28.3.2024, 12:57