8

データベースから画像を .csv ファイルに表示する方法に興味がありますQTableView

QTableWidgetItemで使用できるようなものはありQTableViewますか?

私は使用しますQSqlTableModel

4

2 に答える 2

15

大まかなアイデアは、 を使用QStandardItem::setDataしてQPixmap(に変換されたQVariant) を設定し、 を に設定することQStandardItemですQStandardItemModel

シーケンス: QImage ---> QPixmap---> QVariant---> QStandardItem--->QStandardItemModel

例えば:

QStandardItemModel *model = new QStandardItemModel;
QImage image(":/cat/lovers/own/myCat.jpg");
QStandardItem *item = new QStandardItem();
item->setData(QVariant(QPixmap::fromImage(image)), Qt::DecorationRole);
model->setItem(0, 0, item);
ui->tableView->setModel(model);

ここに画像の説明を入力

必要に応じて、画像またはセルのサイズを変更する必要があります。


[編集]

を使用している場合はQSqlTableModel、そのまま使用してください。これらのパス文字列を作成しQPixmap、アイテムの役割をQt::DecorationRoleその列に設定するだけです。

ドキュメントが言うように:

各項目には関連付けられた多数のデータ要素があり、モデルの data() 関数にロール (Qt::ItemDataRole を参照) を指定することで取得できます。

これを行うためのコンセプトQTableViewQVariant単純です。QPixmapQTableViewQt::DecorationRole

QSqlTableModel仮想関数をサブクラス化して再実装しQVariant data(const QModelIndex & index, int role = Qt::DisplayRole)、イメージ列が装飾ロールを使用してQPixmapasを返すようにすることができます。QVariantしたがって、次のようにします。

QVariant CustomSqlTableModel::data(const QModelIndex &idx, int role = Qt::DisplayRole) const
{
     if (idx.column() == imageColumn) {
         QString imgFile = QSqlTableModel::data(idx, Qt::DisplayRole); // get path string

        if (role == Qt::DisplayRole) 
            return QString(); // return the path string for display role

        QImage image(imgFile);
        /* some modification to the image, maybe */

        QPixmap pixmap(imgFile);
        if (role == Qt::DecorationRole)
            return pixmap;   // return QPixmap for decoration role

        if (role == Qt::SizeHintRole)
            return pixmap.size(); // in case need the image size

     }
     return QSqlTableModel::data( idx, role ); // use original data() outside the imageColumn
}

また、独自のデリゲートをカスタマイズするためにサブクラス化QStyledItemDelegateと関数の再実装を試みることもpaint()できますが、それにはより複雑な作業が必要になります。デリゲートを使用した例は、こちらにありますボタンでさえも、デリゲートで好きなものを描くことができます。

*申し訳ありませんが、手元にデータベースがないため、コードはテストされていません。

于 2014-06-13T09:41:06.633 に答える