Я использую C ++ 11 и QT6 и создаю QtableView с QstandarditemModel для отображения списка предметов (например, автомобилей). Таблица имеет четыре столбца: < /p>
Car Name
Status — e.g., "Available", "Out of Stock", "Limited Edition"
Show — checkbox column
Color — uses a custom ColorButtonDelegate
< /code>
Я хочу, чтобы макет таблицы вела себя так: < /p>
Column 1 (Car Name) resizes to fit its content (ResizeToContents)
Column 2 (Status) has a fixed max width and elides text if too long, and may be highlighted depending on the value
Column 3 (Show) is a small checkbox column (ResizeToContents)
Column 4 (Color) stretches to fill the remaining table space
< /code>
Проблема: < /p>
Все работает, кроме столбца 2 ("Статус"). Когда в этом столбце находится более длинная строка, такая как «ограниченная серия», она заставляет всю таблицу расширяться за пределы ширины своего родительского контейнера. Это приводит к появлению горизонтальных полос прокрутки и разрушает макет, хотя: < /p>
The column is set to QHeaderView::Fixed
Its width is explicitly set (e.g., 160 px)
The text is small enough to fit or be elided
< /code>
Как ни странно, это происходит только с конкретными значениями, такими как «ограниченная серия», но не с более короткими строками, такими как «доступные» или «вне запаса». Я не знаю, является ли тот факт, что если ячейка отображает «ограниченная редакция», ячейка выделена. В последнем столбце только < /li>
Удаление SetStretchLastsection (true) < /li>
< /ul>
все еще, когда появляется «ограниченная редакция», столбец расширяется и заставляет весь макет растягиваться. Я не могу казаться, что это заполняет это. Я просто хочу, чтобы текст появился и был выделен, если необходимо, без расширения всей таблицы. < /P>
Пример код: < /p>
void MyWidget::initializeCarsTable()
{
fCarsTableModel = new QStandardItemModel(this);
ui->tvCars->setModel(fCarsTableModel);
auto* colorDelegate = new ColorButtonDelegate(this);
ui->tvCars->setItemDelegateForColumn(3, colorDelegate);
connect(colorDelegate, &ColorButtonDelegate::colorChanged,
this, &MyWidget::onColorChanged);
ui->tvCars->setItemDelegateForColumn(1, new ElideDelegate(this)); // Status column
// Styling, policies
ui->tvCars->verticalHeader()->setDefaultSectionSize(24);
ui->tvCars->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tvCars->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->tvCars->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tvCars->setSelectionMode(QAbstractItemView::SingleSelection);
ui->tvCars->setAlternatingRowColors(true);
}
void MyWidget::populateCarsTable()
{
fCarsTableModel->clear();
QStringList headers = {"Car", "Status", "Show", "Color"};
fCarsTableModel->setColumnCount(4);
fCarsTableModel->setHorizontalHeaderLabels(headers);
for (const auto& car : carList) {
QList rowItems;
// Car name
auto* nameItem = new QStandardItem(car.name);
nameItem->setData(car.id, Qt::UserRole);
rowItems setTextAlignment(Qt::AlignCenter);
statusItem->setToolTip(car.status);
statusItem->setBackground(car.isSpecial ? QColor("#FFEEEE") : Qt::white);
rowItems setCheckable(true);
showItem->setCheckState(Qt::Checked);
rowItems setData(car.color, Qt::EditRole);
rowItems appendRow(rowItems);
}
auto* header = ui->tvCars->horizontalHeader();
header->setSectionResizeMode(0, QHeaderView::ResizeToContents); // Car
header->setSectionResizeMode(1, QHeaderView::Fixed); // Status
header->resizeSection(1, 160);
header->setSectionResizeMode(2, QHeaderView::ResizeToContents); // Show
header->setSectionResizeMode(3, QHeaderView::Stretch); // Color
}
< /code>
Может ли кто -нибудь объяснить, почему QT расширяет столбец «статус» с длинными строками, даже если он имеет фиксированный размер с достаточным количеством места для текста? Такое поведение происходит с или без делегата с QT :: Elideright.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... ith-longer
Использование C ++ 11 и QT6 моя столбец QTableView расширяет ширину без необходимости с более длинным текстом и выделени ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение