質問: `PySide`でWordライクなテキストエディタを作っている者です。 Wordの表の挿入という機能があります。マウスで表が伸び縮みするし、改行に合わせて伸縮してくれるので、とてもいいものです。`PySide`でそれに対応する最も近いクラスが、`QTextTable`というものなんですけれども、(だと思う)これは非常に扱いずらいです。唯一の美点は、デフォルトの導入自体は割と優しいということです。 これを改良する方法や、いいやり方があるという事をご存知の方は教えていただけませんでしょうか?なんか、希望が見えないクラスです。 `Block`は通常、一行を意味しますが、設定次第によっては、数文字分でブロックを区切ることも可能のようです。ここら辺のドキュメントがかなり少なく、どうすればいいのかわからないです。 これらと組み合わせて使えば、`QTextTable`も、もう少しよくなる気はしています。 そういう意味で、合わせてお聞きしたいと思っています。 デフォルトでは、以下の欠点があります。 ・もし改行やウラッピングで行が増えると、`TextTable`の全体的な大きさは変化しない。例えば、2×2のテーブルがあり、左上のテーブルでテキストを編集し、それが2~3行分になると、もう2列目のテーブルは機能しなくなります。 ・上の全体的な大きさを変化させるための楽なメソッドがない。本家でもどうやってこれにアクセスするのかという質問が見られました。この方は、一つのブロックが2行3行と大きくなると、どんどんそのブロックの大きさを変えようという試みをしようとしたと、私の経験からも推察できます。 QTextTableの、RowHeightsへのアクセスをするには? ・せっかく苦労して編集しても、`BackSpace`キーで操作を誤ると一発で消える。 これは一応、`Ctrl+Z`等で元に戻すことは可能。 ・ワードライクエディタの中でこれを導入すると、1ページ全体に広がり、しかも何ページもついてくる。 なので、最初の大きさを固定化しておかなくてはならない。何かと動作が静的なのです。セット前に全てのデータの範囲や大きさを見究めなくてはならず、柔軟な編集が困難です。 早い話が、セットしたら、その枠内で収まるような文字しか入れ込むことはできません。 一つ一つのセルの横幅と縦幅が自在に楽に変化できるようなメソッドがあれば別ですが、どうやらそういうものは見当たらないみたいです。全く使えないという事は無いんですが、Wordと比べると、機能性が全くなく、プログラマ次第で改変できると思ってたのですが、なんかとっかかりがつかめません。もう表というよりは、表のカタチをした一文字に近いです。このクラスを提供してくれるよりは、こういう表フレームをどうやってこさえたのかを教えてくれたほうがいいくらいです。QWidget系のクラスを継承しているわけではないので、キー操作やマウス操作にもなじみません。 ワードの表の挿入にあるようなことを`PySide`でしたいと思っているのですが、そうしたことは可能でしょうか? **追記** 私はワードライクエディタを作成した際に、初めてQTextTableに触れたので、 気が附かなかったのですが、何の変哲もない通常のQTextEditで、QTextTableを 挿入したところ、上記のような欠点のうち、行の幅が増えても使えなくなるという事はなく、 割と使い心地のいいクラスだという事がわかりました。 上のような挙動が起きるのは、ほかに原因がありそうです。思い当たる節としては、PageSize に強制的に合うようにTextTableが自動で拡張されているように思います。pageSizeを変更したことが、一つのきっかけになっているかも知れません。 ![表の挿入](https://i.stack.imgur.com/ZEj4m.png) ![下にずっと底辺が伸びてゆく](https://i.stack.imgur.com/OhMAp.png) ![一行改行すれば実体のないページが大量に増えていく。](https://i.stack.imgur.com/eUL4k.png) 表の駒数と入れられた表の数がマッチしていませんが、これはスクリーンショットで別々にとったからです。状況としては、見ていただくように、一気にページ最下部まで表がずぼっと延びます。 そして、行を増やしたりでもしたら、次から次へとページが増えていきます。これはどういうことなのかなと思います。逆に、何の変哲もない`QTextEdit`で同様のことを行えば、このような事は起きません。 これを防ごうとして、QTextTableを色々といじった結果、冒頭から語っているような現象が起きました。ページが最下部まで延びることはなくなったのですが、その代わり伸縮してくれなくなりました。 ![3×4の表を挿入してみる。](https://i.stack.imgur.com/9Kv3X.png) すると、 ![4行以上編集しようとすれば、それ以降はハチャメチャになる。](https://i.stack.imgur.com/zlYpK.png) 3×4の表を挿入し、改行でもウラッピングでも何でもいいんですが、合計で縦の長さが4行分を超えると、もう完全におかしくなります。これが当初抱えていた問題です。
回答: **現在生じているバグを直す方法** `QTextTable`の`TextTableFormat`は、`QTextFrameFormat`を継承しています。 そして、`QTextTable`の幅や高さは、その`QTextEdit`配下の`QTextDocument`に、生来的に備わっている`rootFrame`の幅や高さに依存しているようです。 `rootFrame = doc.rootFrame()` で、ルートフレームのフレームフォーマットのプロパティを変更すれば、ドキュメントのrootFrameの矩形範囲を変更することが出来ます。 私は、`QTextDocument`の高さや幅をいじっている際に、`rootFrame`の高さをいじってしまいました。これが原因で、その高さに一致するように、`textTable`の高さも一致してしまっていたのでした。どおりで何の変化もさせていない`QTextEdit`では普通に動いていたはずです。 !この通り 改行や行を入れ込んだとしても、 !konotoori 問題ナッシング。 Wordほどのクオリティは無いにしても、十分通用すると思います。つまり、悪いのは`TextTable`ではなく、私だったという事です。 **UPDATE** `Qt`系で`MicroSoft Word`のTableの挿入と同じ事ができますか?というのが主題だったので、こちらも答えておきます。`Qt`では、`QTextTable`でも十分なほどの機能が備わっていますが、 もしCustomizeした設定を組み込みたいのであれば、`QAbstractTextDocumentLayout`をサブクラス化して、必要なメソッドを再定義したうえで、`QTextDocument`にセットする必要があります。 `QAbstractTextDocumentLayout` API Referenceからの抜粋です。 > > Some applications, e.g., a word processor or a DTP application might need more features than the ones provided by Qt’s layout engine, in which case you can subclass PySide.QtGui.QAbstractTextDocumentLayout to provide custom layout behavior for your text documents. > > > これを読む限りにおいて、DTPアプリケーションやワードプロセッサと同じ特徴等、自分なりのカスタマイズを加えられるようですので、解答としてはできる・・・ということになります。 現在時点での自分の実装では、`QTextTable`をMicroSoft Wordのテーブルと同様、 マウスで自由な場所に移動させることが出来るようになっています。 テーブル関係に絞って言えば、まだ本家SOFでは未解答の`QTextTable`のrowheightコントロール、`QTextTable`の行内配置以外の、テキストの折り返し処理もできるようになるでしょう。 ほとんどMicroSoft Wordに近い事が出来るようになると思われます。 縦書も・・・大体頭の中ではこうすればいいなというのは或るのですが、不可能ではないと思います。ただ、それを実装するためには、まだかなりの時間を要すると思います。 **テーブルは自由に移動できます。拡大縮小も可能です。** !テーブルは自由自在に動かせます