У меня есть объект, который наследует QTableView и переопределяет метод resizeEvent(), чтобы установить ширину столбцов таблицы на преимущество доступного пространства, если таблица в целом будет изменена.Проблема QTableView с resizeEvent()
код выглядит следующим образом:
void DDUTableView::resizeEvent(QResizeEvent* ev)
{
int num_columns = NUM_ELEMENTS(COLUMN_WIDTHS);
if (num_columns > 0) {
int width = ev->size().width();
int used_width = 0;
// Set our widths to be a percentage of the available width
for (int i = 0; i < num_columns - 1; i++) {
int column_width = (width * COLUMN_WIDTHS[i])/100;
this->setColumnWidth(i, column_width);
used_width += column_width;
}
// Set our last column to the remaining width
this->setColumnWidth(num_columns - 1, width - used_width);
}
// Call our base resizeEvent to handle the vertical resizing which
// we don't bother with here
QTableView::resizeEvent(ev);
}
Это все работает отлично, пока пользователь вручную не изменяет один из столбцов и растягивает его за пределы окна просмотра (воспитывающему горизонтальную полосу прокрутки). Затем это вызывает вызов resizeEvent(), который сбрасывает ширину столбца до значений по умолчанию.
Я могу преодолеть эту проблему, подключившись к сигналу sectionResized() в заголовке таблицы и установив таймер. Если resizeEvent() вызывается, пока таймер активен, я не пересчитываю ширину таблицы.
код ниже:
connect(horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(slotSectionResized(int, int, int)));
void DDUTableView::slotSectionResized(int /*logicalIndex*/, int /*oldSize*/, int /*newSize*/)
{
timer_->start(500);
}
void DDUTableView::resizeEvent(QResizeEvent* ev)
{
if (timer_->isActive()) {
return;
}
// etc
Это работает, но это грязное дело. Во всяком случае, простой вопрос: могу ли я предотвратить вызов resizeEvent(), если пользователь вручную настраивает заголовки столбцов за пределы области просмотра? В качестве альтернативы, если нет, можно ли идентифицировать в resizeEvent(), произошла ли эта конкретная ситуация без необходимости устанавливать таймеры и тому подобное?
Судя из вашего кода, когда пользователю регулировать размер цв будет вызывать COLUMN_WIDTHS быть написано, правильно? Я думаю, когда пользователь изменит размер col, который говорит, что пользователь ожидает, что один col имеет более высокое значение в COLUMN_WIDTHS, что уменьшит некоторые другие проценты col в COLUMN_WIDTHS. –