teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1380閲覧

Qt5のQAbstractItemModelの中から、対応するQTableViewを取得する方法はあるのでしょうか?

jiro.kaihatsu

総合スコア16

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2022/07/11 14:56

0

1

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • 前提として、Model/Viewの考え方は守りたいです。
  • Model(QAbstractItemModel)から、対応するView(QTableView)を取得するにはどうすればよいでしょうか。

は矛盾してしまっているので、後者に対する回答としては「ありません」

例えば、ファイル一覧のモデルをツリービューやリストビューで表示といったように
Model は複数のView から参照することができます。

View に対応するModel はありますが、
Model に対応する View という考え方はありません。(Model/Viewの設計として誤りです)
Model/View の考え方的にも Model は View に依存してはいけません
→ Model 側のメソッドでは View のデータを参照してはいけない

解決策としては、Model/View の枠内での対応方法としては
Model / View の依存関係を順守し

Model 側の data() では Qt::UserRole 以降の値を使い
View 側で使いたい独自のデータを返すようにします。
View 側からはそのロールのデータを問い合わせるような構成にします。
依存関係は View → Model なので、Model 側は View の事を知る必要はありません。

投稿2022/07/17 06:46

teamikl

総合スコア8817

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jiro.kaihatsu

2022/07/23 12:25

お礼が遅れてごめんなさい。 たしかにおっしゃるとおりですね。 Qt::UserRoleを使う方法で検討してみます。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問