2014-09-29 5 views
0

У меня есть объект, который наследует 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(), произошла ли эта конкретная ситуация без необходимости устанавливать таймеры и тому подобное?

+0

Судя из вашего кода, когда пользователю регулировать размер цв будет вызывать COLUMN_WIDTHS быть написано, правильно? Я думаю, когда пользователь изменит размер col, который говорит, что пользователь ожидает, что один col имеет более высокое значение в COLUMN_WIDTHS, что уменьшит некоторые другие проценты col в COLUMN_WIDTHS. –

ответ

0

Проверка видимости полосы прокрутки для моего сценария.

void DDUTableView::resizeEvent(QResizeEvent* ev) 
{ 
    if (!horizontalScrollBar()->isVisible()) { 

     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); 

}