Qt (B2) QTableWidgetで複数行のテキスト入力
公開日| 2009年06月18日 | コメントはまだありません。
カテゴリー:Qt |
概要 : 今回のテーマは、QTableWidgetの入力についてです。QTableWidgetでは、デフォルトで、QLineEditが入力用のWidgetとして 用意されています。QTableWidgetを入力可能状態で、作成するとマウスのダブルクリックなどで、入力できるようになります。
今回は、その入力をQTextEditやQPlainTextEditなどの複数行入力できるWidgetへ切り替える方法について記述したいと思います。
ここで使用したサンプルソースコード:
簡単なQTableWidgetの画面
単純なQTableWidgetのサンプル画面を作ってみましょう。以下のコードでは、3x3の簡単なQTableWidgetの画面を作成しています。
[main.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <QtGui> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTableWidget tableWidget(3, 3); // set edit trigger event tableWidget.setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked | QAbstractItemView::EditKeyPressed ); // set title QStringList headerLabels; headerLabels << "Name" << "Attribute" << "Comment"; tableWidget.setHorizontalHeaderLabels(headerLabels); QTableWidgetItem *item[3]; // set sample data values. for (int nrow = 0; nrow<3; nrow++ ) { item[0] = new QTableWidgetItem(QString("sample item name #%1").arg(nrow+1)); item[1] = new QTableWidgetItem(QString("att #%1").arg(nrow+1)); item[2] = new QTableWidgetItem(QString("comment #%1\nreturn ").arg(nrow+1)); for(int ncol=0;ncol<3;ncol++){ tableWidget.setItem(nrow, ncol, item[ncol]); } } // fit of column size at contents. tableWidget.resizeColumnsToContents(); tableWidget.resize(500, 300); // table show. tableWidget.show(); return app.exec(); } |
10行目から12行目で、入力可能な状態へするときの動作を定義しています。
ここでは、ダブルクリックと、選択状態で1クリックとF2などの入力キー操作で、入力可能な状態へ遷移します。
33行目は、セルの多いさを内容にあわせて縦横ともに拡大・縮小するように指示しています。
これをコンパイルして、実行すると、以下のような画面が表示されます。

3カラム目は、情報の中に改行情報が含まれていますが、QLineEditでは、それが無視されます。
では、これを入力できるようにするには、ドキュメントから、すぐに見つかるのは、 QTableWidgetのvoid setCellWidget () だと思います。
では、このメソッドを使った場合、どのようになるか見てましょう。
setCellWidgetを使って、複数行の入力画面を作成
先の単純なQTableWidgetのサンプル画面を変更してみましょう。以下のコードでは、3x3の簡単なQTableWidgetの画面を作成しています。
[main.cpp]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <QtGui> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTableWidget tableWidget(3, 3); // set edit trigger event tableWidget.setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked | QAbstractItemView::EditKeyPressed ); // set title QStringList headerLabels; headerLabels << "Name" << "Attribute" << "Comment"; tableWidget.setHorizontalHeaderLabels(headerLabels); QTableWidgetItem *item[3]; // set sample data values. for (int nrow = 0; nrow<3; nrow++ ) { item[0] = new QTableWidgetItem(QString("sample item name #%1").arg(nrow+1)); item[1] = new QTableWidgetItem(QString("att #%1").arg(nrow+1)); item[2] = new QTableWidgetItem(QString("comment #%1\nreturn ").arg(nrow+1)); for(int ncol=0;ncol<3;ncol++){ tableWidget.setItem(nrow, ncol, item[ncol]); QPlainTextEdit *ptext=new QPlainTextEdit(&tableWidget); ptext-->setPlainText(item[ncol]-->text()); tableWidget.setCellWidget(nrow, ncol, ptext); } } // fit of column size at contents. tableWidget.resizeColumnsToContents(); tableWidget.resize(500, 300); // table show. tableWidget.show(); return app.exec(); } |
簡単ですね。
29行目から31行目で、QPlainTextEditをsetCellWidgetで各セルに関連付けを行っています。
これをコンパイルして、実行すると、以下のような画面が表示されます。

全てのセルが、常に複数行のテキストの入力が行える状態ですが、恐らく、期待していた画面と違うと思います。 これでは、QGridLayoutでQPlainTextEditを貼り付けた画面と同じような画面です。
では、最初のサンプルの動作と同じような(入力状態が切り替わるような)動作で、単純にQLineEditを QPlainTextEditへ切り替えるには、どうすれば良いでしょう。
Delegateを継承したクラスを使うのですが、 次は、QStyledItemDelegateを継承したクラスを作成して、QTableWidgetをコントロールしてみましょう。
ページ: 1 2

