Qt5でSQLiteデータベースのGUIを開発しています。私はQSqlQueryModel
とQTableView
を使ってデータを保存して表示します。Qt5サブクラス化QStyledItemDelegate書式設定
次に、switch文を使用して、特定の列の数値をリテラル(たとえば1 = "Hello"、2 = "World")に置き換えるカスタムデリゲートを作成しました。
デリゲートはデータを必要に応じて表示し、機能的に機能します。ただし、カスタムデリゲートがペイントする列は、デフォルトのペイント方法であるQStyledItemDelegate
とは異なる形式です。値は中央の左上ではなく左上に表示され、変更された列は自動的に列を展開して完全な値を表示しなくなり、選択された列のセルは青色に変わらず点線で囲まれません。
私は、この例のプログラム作成:これはpainter->drawText()
にoptions.displayAlignment
を追加することによって、テキストの配置を修正し
#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();
}
を。また、選択状態に従ってセルを塗りつぶす文を追加しました(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() 'メソッドをオーバーライドすることができます。 –