QTableViewとQAbstractItemModel派生クラス(ここではMyModel)
を組み合わせて使っています。
そこで、QTableViewの行の高さをQTableViewに任せるのではなく、自分の考える高さに設定したいのですがその方法がわかりません。自分の考える高さとは、表示しているテキスト(2行以上の場合も有り)の1.5倍を設定したいと考えています。
前提として、Model/Viewの考え方は守りたいです。
QtのModel/Viewの流儀に従う場合、Model(AbstractItemModel)のdata()で、ロールがQt::SizeHintRoleの場合、data()の戻り値として自分の考える高さをQSize型変数として返せば良いのだと思っています。
しかし、Model(QAbstractItemModel派生クラス)のメンバ関数の中で、QModelIndexが示すView(QTableView)を取得する方法、又、そのQTableViewのセルに表示しているテキストを取得する方法がわからないため実現できていません。
Model(QAbstractItemModel)から、対応するView(QTableView)を取得するにはどうすればよいでしょうか。
サンプルを次に挙げておきます。
c++
1QVariant MyModel::data(const QModelIndex &index, int role) const 2{ 3 if (! index.isValid()) return {}; 4 5 int row = index.row(); 6 int column = index.column(); 7 8 if (role == Qt::DisplayRole) 9 { 10 if (index.isValid()) { 11 if (row == 0) { 12 auto value = _raw->getData(index.row(), index.column()); 13 return "ヘッダに見せかける\n2行目"; 14 } 15 else { 16 auto value = _raw->getData(index.row(), index.column()); 17 return QString::number(value, 'f', 2); 18 } 19 } 20 } 21 else if (role == Qt::TextAlignmentRole) 22 { 23 return {Qt::AlignCenter | Qt::AlignHCenter}; 24 } 25 else if (role == Qt::BackgroundColorRole) { 26 if (row == 0) { 27 /* 28 * データ部だが、標準的なQTableViewのヘッダの色にしたい。 29 * ここで、標準の色を取得する方法は? 30 */ 31 } 32 33 return {}; 34 } 35 else if (role == Qt::SizeHintRole) 36 { 37 // spanではQSize(1, 1)しか得られない 38 auto size = span(index); 39 40 if (row == 0 && column == 0) { 41 /* 42 * 表示中のテキストの高さの1.5倍にしたい。 43 * 表示中のテキストの高さを得る方法は? 44 */ 45 } 46 47 return {}; 48 } 49 50 return {}; 51}
MyModelクラスは次のような宣言です。
c++
1#pragma once 2 3#include <QAbstractTableModel> 4 5#include "RawData.h" 6 7class MyModel : public QAbstractTableModel 8{ 9 Q_OBJECT 10 11public: 12 explicit MyModel(RawData* raw, QObject *parent = nullptr); 13 int rowCount(const QModelIndex &parent = QModelIndex()) const override; 14 int columnCount(const QModelIndex &parent = QModelIndex()) const override; 15 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; 16 17 bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; 18 19 Qt::ItemFlags flags(const QModelIndex &index) const override; 20 21public slots: 22 23 void onUpdateAll(); 24 25private: 26 RawData* _raw; // 情報源 27}; 28
MyModelクラスを使って画面を構成している処理は次です。
c++
1_tableView = new QTableView(this); 2{ 3 _tableView->setModel(_tableModel); // MyModelをQTableViewに設定する。 4 _tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); // デフォルトでストレッチサイズを指定する 5 _tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); // デフォルトでストレッチサイズを指定する 6 _tableView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 7 8 /* 9 * QTableViewの標準的なヘッダは使わない。任意のデザインにできないため。 10 */ 11 _tableView->verticalHeader()->hide(); 12 _tableView->horizontalHeader()->hide(); 13 14 /* 15 * @point 16 * ヘッダは非表示だが、ヘッダのリサイズモードは設定しないとsizeHintが呼ばれないので、 17 * 任意の高さに設定できない。 18 */ 19 _tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); 20 21// _tableView->setItemDelegate(&_myDelegate); // Delegateでも行の高さを設定できる 22 23 // データ部を使ってヘッダのようにに見せかける 24 _tableView->setSpan(0, 0, 1, 3); 25 26} 27

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/23 12:25