Я разрабатываю графический интерфейс для базы данных SQLite в Qt5. Я использую QSqlQueryModel
и QTableView
для хранения и отображения данных.Qt5 Подкласс QStyledItemDelegate Форматирование
Затем я создал пользовательский делегат, чтобы заменить числовые значения определенных столбцов на их литералы в представлении таблицы (например, 1 = «Hello», 2 = «World») с помощью оператора switch.
Делегат отображает данные как следует и работает функционально. Тем не менее, столбцы, которые пользовательский делегат рисует, имеют другой формат по сравнению с методом по умолчанию по умолчанию QStyledItemDelegate
. Значения находятся вверху слева, а не в центре слева, измененный столбец больше не будет автоматически расширять столбец, чтобы отображать полные значения, а ячейки в столбце не становятся синими или имеют пунктирный контур при выборе.
Я создал этот пример программы:
#include <QApplication>
#include <QModelIndex>
#include <QPainter>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QTableView>
class TestDelegate: public QStyledItemDelegate {
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)
const Q_DECL_OVERRIDE
{
if (index.column() == 0) {
int value = index.model()->data(index, Qt::DisplayRole).toInt();
QString str;
switch (value) {
case 1:
str = "Hello0000";
break;
case 2:
str = "World0000";
break;
}
if (option.state.testFlag (QStyle::State_Selected)) {
painter->fillRect(option.rect, option.palette.highlight());
qApp->style()->drawItemText(painter, option.rect, option.displayAlignment, option.palette, true, str, QPalette::HighlightedText);
} else {
painter->drawText(option.rect, option.displayAlignment, str);
}
} else {
return QStyledItemDelegate::paint(painter, option, index);
}
}
};
int main(int argc, char **argv) {
QApplication app(argc, argv);
QStandardItemModel model(2, 2);
model.setHorizontalHeaderItem(0, new QStandardItem(QString("A")));
model.setHorizontalHeaderItem(1, new QStandardItem(QString("B")));
model.setData(model.index(0, 0, QModelIndex()), 1);
model.setData(model.index(1, 0, QModelIndex()), 2);
model.setItem(0, 1, new QStandardItem(QString("Hello")));
model.setItem(1, 1, new QStandardItem(QString("World0000")));
QTableView view;
view.setItemDelegate(new TestDelegate);
view.setModel(&model);
view.resizeColumnsToContents();
view.show();
app.exec();
}
Это фиксирует выравнивание текста путем добавления options.displayAlignment
к painter->drawText()
; Я также добавил дополнительный код в операторе if(option.state & QStyle::State_Selected)
, который рисует ячейку в соответствии с ее состоянием выбора. Поэтому, если он не выбран, текст будет черным, если текст станет белым, а синий фон. Однако я до сих пор не могу получить столбцы для расширения, чтобы они соответствовали содержимому ячеек или добавляли пунктирную линию по внешней стороне ячейки, как это происходит со стандартным делегатом.
Есть ли простой способ сохранить стиль таблицы по умолчанию при использовании моего пользовательского метода рисования?
Можете ли вы предоставить код своего делегата? –
В нем мало кода. Он переопределяет метод рисования для делегатов, внутри тела метода: if (index.column() == 3) {// оператор switch // painter-> drawText (option.rect, literalStr);} else {return QStyledItemDelegate: : paint (painter, option, index) – mrwolf
Если все, что вы хотите сделать, это заменить числовые значения на строковые значения для отображения, считаете ли вы, что хотите оставить делегат по умолчанию и вместо этого прокси-модель прокси? Вы можете подклассифицировать 'QIdentityProxyModel' и переопределить его метод' data() ', который может быть всем, что вам нужно. –