QTableView 열 너비를 균등하게 조정하는 방법

QTableView에서 열 너비 자동 조정 전략

Qt 애플리케이션 개발 시, 데이터 표시용 위젯으로 QTableView를 사용하는 경우가 많다. 특히 데이터베이스 조회 결과를 표 형태로 출력할 때, 열의 너비가 적절하지 않으면 가독성이 떨어지기 때문에 열 너비를 스마트하게 조정하는 것이 중요하다. 기본 제공 기능만으로는 제한적이므로, 실제 콘텐츠에 맞춰 최적의 너비를 계산해 적용하는 방식이 효과적이다.

기본 리사이징 모드 활용

Qt는 헤더 뷰를 통해 간단한 열 크기 조정 정책을 제공한다. 가장 대표적인 방법은 setSectionResizeMode() 함수를 사용하는 것이다.

#include <QHeaderView>

// 모든 열을 테이블 전체 너비에 균등 분배
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

// 각 열 내용에 맞춰 자동 조정 (너무 좁아질 수 있음)
tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);

위 코드 중 Stretch 모드는 공간을 고르게 나누지만, 텍스트 길이를 고려하지 않아 짧은 제목이 잘릴 수 있다. 반면 ResizeToContents는 내용 기반으로 조정되나, 데이터가 비어 있을 경우 헤더보다 좁아지는 문제가 발생할 수 있다.

폰트 기반 동적 너비 계산

더 정교한 제어를 위해 폰트의 픽셀 너비를 기준으로 열 크기를 결정할 수 있다. QFontMetrics 클래스를 이용하면 주어진 텍스트가 차지하는 실제 너비를 계산할 수 있다.

int calculateTextWidth(const QString &text, const QString &fontFamily, int fontSize) {
    QFont font(fontFamily, -1, QFont::Normal);
    font.setPixelSize(fontSize);
    QFontMetrics metrics(font);
    return metrics.boundingRect(text).width();
}

이 함수를 활용해 헤더 라벨과 각 열의 데이터 중 가장 긴 텍스트 너비를 미리 분석하면, 보다 적절한 열 크기를 결정할 수 있다.

최적의 열 너비 결정 로직

실제 적용 시에는 다음 세 가지 요소 중 최댓값을 선택하는 전략이 효과적이다:

  • 헤더 텍스트의 너비
  • 해당 열 내 데이터 중 가장 긴 텍스트 너비
  • 테이블 남은 공간을 열 수로 나눈 평균 너비
// 테이블 전체 너비 기준, 수직 스크롤바 및 여백 고려
int totalWidth = tableView->width() - 20;
int checkboxColumnWidth = 80; // 첫 번째 열(체크박스) 고정 너비
int contentWidth = totalWidth - checkboxColumnWidth;
int columnCount = model->columnCount();
int averageWidthPerColumn = contentWidth / (columnCount - 1); // 첫 번째 제외

// 첫 번째 열 설정
tableView->setColumnWidth(0, checkboxColumnWidth);

// 나머지 열 처리
for (int col = 1; col < columnCount; ++col) {
    QString headerText = model->headerData(col, Qt::Horizontal).toString();
    int headerWidth = calculateTextWidth(headerText, "Microsoft YaHei", 16) + 12;

    int dataMaxWidth = m_maxColumnWidths.value(col, 0) + 10; // 사전 분석된 최대 데이터 너비

    int finalWidth = qMax({headerWidth, dataMaxWidth, averageWidthPerColumn});
    tableView->setColumnWidth(col, finalWidth);
}

이 방식은 헤더와 콘텐츠 가독성은 물론, 여백을 고르게 배분함으로써 시각적으로도 자연스러운 테이블 레이아웃을 구현할 수 있다.

태그: Qt QTableView QHeaderView QFontMetrics C++

6월 19일 19:06에 게시됨