Я переопределил классы:
Класс 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);
}
}
Эта функция "почти" работает - высота таблицы меняется на мгновение, но затем разделитель сплиттера прыгает обратно. Как это можно вылечить? В чем тут вообще может быть дело?