asaのブログ

プログラミングの勉強まとめ

Qtチュートリアル13(QColorクラス)

 ペイントソフトにアルファ値を追加しました。1~255の範囲でペンの濃度を変化させることができます。

 実際に変化させてみると下のようになります。

 

f:id:asa_r:20170727223504p:plain

 スロットと関数を見ていきます。ただしスロットと関数の実装をする前に画像のフォーマットをARGBに設定しておく必要があります。

 

 スロット

 

gist75c58216b40122b2d43d81d84e51ecbc

 

 関数の実装

 

giste847f8e64b35619cdc3885ea3b16b4f5

 

 

Qtチュートリアル12(画像の反転)

 QImageのmirroedを使って画像の左右・上下反転を実装しました。便利なことに違いはなく簡単に実装できるのが良点ですが・・・少し使い勝手が悪いです。

 座標を取得してそれぞれx成分、y成分を入れ替えるて実装するのもありな気がしてきました。 

 

 スロット

 それぞれ反転する方向に対してbool値を設定してやります。

gist41cc582a22957c02cf6126f33d356406

 

 関数の実装

 スロットから渡された値を使って反転処理を行います。

gistff509791a66ee5b39d8b1aec77bf0e84

 

Qtチュートリアル11(回転)

 この前作ったQtのお絵描きソフトに回転機能を追加しました。

 アンドゥの実装も現在進行中で、最近QUndoStackがあることを知ったのでそれを今後使用する予定です。

 メニューバーに”Effect”を追加しました。Rotateボタンを押すと回転します。

f:id:asa_r:20170724154642p:plain

 

 QActionとスロットの接続

 コードを抜粋していきます。

gistfbe37897238b2bbc0f9d68d2597edba4

 

 Menuへの追加

gist0f19dbcc4b60251e1085969fa04e37a4

 

 スロットの実装

 ダイアログから任意の回転角を取得もしてみましたが、回転によってジャギが入ってしまったので、今は固定です。

gist46ba259ff94b8448c86292018ca7f945

 

 関数の実装

gist1803a6d65ae40253f98d1499f5a1448d

 QMatrixを使用して回転しています。ちなみに後で調べたところ、回転などの変形はQtranformクラスが推奨されているので、今後切り替えます。

 参考:QTransform Class | Qt 4.8

 

Qtチュートリアル10(描画機能)

 描画関係のコードを下にまとめました。コメントで大体に書きましたが、1つとてもおもしろい機能があったので紹介します。

 

 updateというメソッドをこれまで何度か使用してきました。これはQWidgetクラスのメソッドで、画面を再描画する必要があるときに呼び出します。updateメソッドは引数を持たないメソッドの他にオーバーライドされた3つのメソッドを持ちます。3つのメソッドはそれぞれ指定した領域のみを再描画します。

 参考:QWidget Class | Qt 4.8

 

gistfe319e87f19a7da873ae3547f11a8fca

Qtチュートリアル9(QPenのカラーと太さの変更)

 描画時の線の太さと色を変える機能を見ていきます。これまでなんとなく流れがつかめてきましたが、QtでGUIを構築する際の流れはMVCモデルに沿うと、UIの作成⇒スロットの接続⇒スロットの実装⇒モデルの実装です。

 

 画面的には次のように選択画面があり、

f:id:asa_r:20170724101155p:plain

カラーダイアログがあり、

f:id:asa_r:20170724101428p:plain

線の太さを決めるスピンボックスがあります。

f:id:asa_r:20170724101513p:plain

 

 メニューとスロットの接続

gist835cd0aa706254396ceaa201f52f4c34

 

 メニューを構築する際に使用するQActionについてですが、これはユーザーが実行する命令をまとめて抽象化したものにあたります。ペンの色を変えることを考えると、この画面にはありませんがツールバーを使用する方法もあります。

 オプションによるカラーの選択やツールバーによるカラーの選択などの"カラーを選択する"命令をQActionクラスは代替することができます。

 参考:QAction Class | Qt Widgets 5.9

 

 スロットはpenColor、penWidthというメソッドにつながっていますので、これを見ていきます。

 

 スロットの実装

gist73e29c1ec12d3b60e09522c379dc600b

 カラーダイアログはQColorDialogからすぐに呼び出すことができます。QColorDoalogクラスにはgetColorメソッドを呼び出しています。引数にQColorが選択されていますが、これはカラーダイアログが最初に示す色(Initial Color)を渡す必要があるからです。

 

 ダイアログでキャンセルを選択すると、途中で選らんだ色は無効になります。これをチェックするため、QColorクラスのisValidメソッドを使って色の有効無効を確認しています。有効なら新しい色をペンにセットします。

 

 インプットダイアログについてはずばりこちらが分かりやすいです。長いですがそこまで複雑なものではありません。

 参考:QInputDialog Class | Qt Widgets 5.9

 

 メソッドの実装

gist24b4aeb6dd2bb375eeb72c51ddf9860e

 

Qtチュートリアル8(画像保存)

 前回の画像表示と同じく、画像保存もMVCモデルが基になってます。

 関連するメソッドは

  • save
  • saveFile
  • saveImage

です。またクラスについては

  • QObject
  • QAction
  • QImage
  • QString

が関わる点を念頭に置くと分かり良いです。

 

 saveスロット

gist8296b075eaaedb077c38c49175d5e1fb

 

 どのファイル形式で保存するのかを受け取ります。ファイル形式は、メニューバーを作るときに羅列する形で展開しています。このときにsetDataメソッドを使ってファイル形式を埋め込んでいます。この埋め込んだファイル形式を取得します。

 senderメソッドを使って送ったシグナルのポインタを返します。これをキャストしてQActionに流します。QActionクラスにはsetDataメソッドで埋め込んだデータを取り出すdataメソッドがあるので、それを使ってファイル形式を取得します。

 ファイル形式を取得したらそれをsaveFileにファイル形式を渡します。

 

 saveFileメソッド

gist93a1918f33288b99c398f4e19b2264e2

 実は画像表示で解説したものとあまり代わりがありません。ファイル名を取得するためにダイアログを表示しています。ダイアログのフィルター部分がコードが込み合ってますが、こちらを参考にされると分かり良いかと思います。

 ・QString Class | Qt Core 5.9

 

 saveImageメソッド

gist46119ceca28d03968951a5ba5e9cc1a8 

 重要な点についてはコメントに記載していますが、とりわけQImageクラスのsaveメソッドが非常に楽に画像保存を可能にしているのがQtのいいところです。