Проблема QTableView с resizeEvent()C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Проблема 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(), произошла ли эта конкретная ситуация, без необходимости устанавливать таймеры и тому подобное?

Подробнее здесь: https://stackoverflow.com/questions/261 ... esizeevent
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»