So-net無料ブログ作成
検索選択

Qt Designerで追加したslotの削除とsignal/slotのconnect [Qt]

さて、slotを追加できたのはいいんですが、どうやって削除すればいいんでしょうか・・? いろいろクリックしていても、削除の方法が出てこなさげです。

今回、追加ボタンの名前を変えたいだけなので、試しにボタンの名前を「pushButton」から「addButton」に変えてみました。そして、右クリック→「Go to slot」したところ、また新しいslotが追加されました・・。できたスロットは「on_addButton_clicked」。名前は固定ですかね・・? もしかしたら、これで古い方は削除すればいいだけなのかもしれません。

よくわかりませんが、これで実行してみましたところ、新しく作成したslotが呼ばれていました・・。じゃあ、削除は手動ですかね・・。と言うことで、前々回前回追加した項目は手動で削除することにします。

で、実行。で、問題無く動作しました。と、それはいいんですが、ソースを見てもsignalとslotをconnectしている箇所が見当たりません・・。何故つながってるんでしょうか・・?

UI関連のファイルに定義されているのかなと思い、「mainwindow.ui」をテキストエディタで見てみたところ、ソースの末尾に「<slots>」と言う項目が追加されていました。

10113000.png
スロットの記述はありました


これ、最初に作成したslotですね・・。これを消すにはどうすればいいんでしょう・・・?

目的のものが無かったので、次に「ui_mainwindow.h」を覗いてみたところ、「Ui_MainWindowClass」と言うクラスの「setupUi()」と言う関数の中に「QMetaObject::connectSlotsByName(MainWindowClass);」との記載があります。これがそうなんですかねぇ・・。

10113001.png
これ?


と言うことで、「QMetaObject」の説明を見てみます。そこの「connectSlotsByName()」関数の説明を見てみると、全ての子オブジェクトから「void on_<object name>_<signal name>(<signal parameters>);」と言う形のslotを探して接続するとのこと。と言うことで、Qt Designerを使う時はsignalが自動で作成されるslotに自動でconnectされる様です。・・・結構、やっつけで作った感じがしないでもないですね。

・・・オブジェクトの名前を変えた時に追随してくれるといいんですが、それは無さげですね・・。「リファクタリング」っていうメニューでも無いんかな・・?


以上で、Qt Designerでのslotの追加と接続の方法がわかったので、次回より各オブジェクト名を変更して、追加して行くことにします。


つづく。






Qt Designerでのslotの追加 [Qt]

前の記事で疑問を提示しましたが、他に解決法もよくわからないので、釈然としないながらも手動で関数を追加することにします。

「mainwindow.h」に定義されているMainWindowClassのprivate区画に「void addButtonClicked();」を追加し、「mainwindow.cpp」に、関数の実装を記載します。

10112300.png
宣言を追加


10112301.png
とりあえず、デバグ出力


これで、実行してみます。

エラーが出ましたね。うまくconnectされていない様です。

10112302.png
うまくいかんねぇ・・


「Object::connect: No such slot MainWindow::addButtonClicked() in ui_window.h:135」と言うエラーが出ています。以前の記事を読み返したら、slotの追加自体を完全に手動に切り替えてますね。今回は、スロットの作成と接続はQt Designerでやっています。関係だけQt Designerで指定して、スロットの実体は手動で書くのかと思いましたが、根本的にそれは違うのでしょうか・・?

*

色々見てみましたがよくわからなかったので、当てずっぽうで、Edit widgetsモードでボタンを右クリックして、「Go to slot」を選択したところ、なにやら自動でスロットが作成されました・・。

10112303.png
名前も自動で付けられました(mainwindow.cpp)


ん~、こちらが正しい方法なのでしょうか?と言うことは、前回つなげた線は意味が無くなりますねぇ・・。と言うか、先にこちらを作ってから線をつなげるべきなんでしょうか・・?

slotの名前が気に入らないんですが、とりあえず、これで実行してみたところ・・、ちゃんと反応しました。ちなみに、「mainwindow.h」にもslotが追加されていました。

10112304.png
プロトタイプも自動作成(mainwindow.h)


なるほど、slotはこれで追加をすればいいんですね。でも、接続先を変えたい時はどうすればいいんでしょうか・・? ま、それはそれとして、名前の変更もしたいので、一旦これまで追加して行ったものを削除することにします。

*

と思いましたが、ボタンを右クリックして「Change signals/slots」を選択しようと思ったら、そのメニューが無くなっています・・。

10112305.png
なんで・・?


追加したslotの削除方法は無いんでしょうか・・・?


つづく。


【参考】
Qt Designer's Signals and Slots Editing Mode




   


ボタンのイベントを取得したい [Qt]

前回、国際化対応について調べましたが、ボタンに書かれている文字列をQt Designer上で直接入力したところ、ソース上には現れませんね・・。ソースの文字列をtr()で囲おうと思ったんですが、これの国際化対応はまた別の処理が必要な気がしてきました・・。ちなみに文字列は.uiファイルに入っています。もう面倒なので、後回しにしますか・・。

*

ボタンの文字列を変更して、実行したものがこちらです。最初に書いた図とは、ボタン内の表記を変えていますが、まあ、とりあえずこちらの様な感じで行こうと思います。

10111600.png
画面上にもうちょっと説明が必要な気がしますね


さて、まずは「追加」及び「選択」を押したときにディレクトリ選択のダイアログが出る様にしたいと思います。と思ったところで、どこに処理を追加しようかなと悩んでしまいました。いきなり、レイアウトから始めたので、現状はMainWindowクラスしか存在していません。そういや、ボタンに動作を追加するのってどうでしたっけ・・?

その辺の話は、こちらに書かれている様です。って、以前見た様な見てない様な・・。「Edit」→「Edit signals/slots」でsignal/slotの編集モードに入ります。

10111601.png
モードの変更が必要なのね


まずは、「追加」のボタンからフォームにsignalを送って見ることにします。追加のボタンからぐいぃ〜っとドラッグすると、電気回路図のグランドみたいなマークが出てきて、離すと次のダイアログが出てきました。

10111602.png
clicked()につながるslotを追加?


signal(pushButton)側に「clicked()」と「clicked(bool)」がありますが、前者は単に後者の引数がfalseに設定されているものの様です。この引数は、ボタンが「checkable」の場合に意味があるようです。今回はいらないので、前者でいいですね。

MainWindowClass(QMainWindow)側にslotが何も出ていないので、「Edit」ボタンをクリックして、MainWindowクラスにslotを追加してみましょう。

10111603.png
これで関数を追加ですかね


「Slots」側の「+」ボタンを押して、slot関数を追加します。

10111604.png
ま、名前は普通に


追加されたslotを選択して、「OK」を押します。

10111605.png
OK


左下の「Show signals and slots inherited from QWidget」と言うのが気になりますね・・。試しに、チェックを入れたら、デフォルトで用意されているsignal/slotが全部表示されました。あ~、そう言うことね・・。

10111606.png
関係無かった・・


これは、今はどうでもいいことでした。気を取り直して「OK」をクリック。すると、フォーム上に接続の様子が出てきました。画面が狭いので、見にくいですね・・。

10111607.png
見にくい・・


さて、とりあえず、ここで保存をして、追加したslotである「addButtonClicked()」を編集したいと思います。と思って、ソースを見てみましたが、特に関数は追加されていません・・。どうすりゃええの・・?昔の記事では、手動で追加してるみたいですね。


んんん~。ほんとにそれが正解なのか・・? つづく。




   

国際化対応 [Qt]

歩みが遅い上に寄り道ばかりしていて、全く進まないんですが、Qtの国際化対応について学習します。国際化に関するページを読んでいたら、Qt Linguistのマニュアルも読めとのこと。そう言えば、Qt関連の開発環境をインストールした時に、「Qt 4リンギスト」と言うのも入ってました。

とりあえず、立ち上げてみましょう。

10110900.png
どうすりゃいいのでしょうか?


マニュアルが作業する対象によって分かれている様ですが、まずプログラマ向けのマニュアルを見てみようと思います。・・・なんか、遠回りな書き方をされている様な気がしますが、書かれている順にまとめてみましょう。

.tsファイルの作成
このファイルには「ユーザに見えるテキスト」、「アプリケーション上でのCtrlキーアクセラレータ」、「翻訳語」が含まれているようです。「lupdate」と言うツール(コマンドラインツール?)が肝な様で、.tsファイルの作成、Qt Linguistで追加した翻訳と元のテキストのシンクロを行うようです。また、「lrelase」と言う通るで、.tsファイルから.qmファイルを作成し、アプリは.qmファイルを実行時に利用するとのこと。作成したファイルの設定と文字コードの設定のため、.proファイルも編集する必要があるようです(lupdateがやってくれそうな雰囲気もありますが、不明)。

「lupdate」「lrelease」の使い方はこちらとのこと。


翻訳の読み込み

翻訳を利用する際は、main()関数に下記の記述を入れるとのこと。ラストの行は、文字コードの設定です。

QApplication app(argc, argv);

QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);

QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));


なお、翻訳ファイルが見つからなければ、ソースコードのテキストがそのまま利用されるとのこと。


「ユーザに見える文字列」の翻訳

翻訳対象の文字列を指定する際、普通の文字列リテラルを「tr()」で囲えばいい様です。例えば、こんな感じ。

button = new QPushButton(tr("&Quit"), this);


後、色々書かれていますが、今は「tr()」を使えばいいと言うのが分かれば、それでオッケーの様な気もしますね。実際の翻訳作業はまた最後の方でと言う事で・・。でも、「&Quit」の様にショートカットキーの指定をこの時点で行う様なので、デフォルトの言語は英語にしとかないといけない感じですねぇ・・。


分かった様な、分からん様な感じ(と言うか、たぶん分かってない)ですが、つづく。


【参考】
Internationalization with Qt - Qt Reference Documentation 4.5.3
Qt Linguist Manual - Qt Reference Documentation 4.5.3







レイアウトの追加 [Qt]

前回、思いつきでバックアップツールの開発を開始しましたが、適当に部品を配置し始めたため、レイアウトを使うのを忘れていました・・・。まだ特にコードを追加してたりするわけではないので、最初からやり直してもいいんですが、後学のため、このままレイアウトを追加してみようと思います。

で、前回アップしてたラフな絵に従って部品を配置したのですが、その配置先のMainWindowClassに直接verticalLayoutを追加したところ次の様になってしまいました。

10110200.png
まあ、こうなるわな・・


分かりにくいかもしれませんが、一応、前回描いた画面案と見比べていただけるとありがたく思います。

ここから、前回の画面案の「コピー元」とその追加(+)、削除(-)ボタンを横に並べようと、右横の「Object」ウィンドウでそれら3つの部品を選択して、右クリック→「Layout」を選択したところ・・、「Break Layout」しか選択できません・・。レイアウトの中に入っている部品にレイアウトをつけるのはできないようですね。

仕方がないので、先程追加したレイアウトを解除し、末端から順にレイアウトしていきました。完了後はこちら・・・。画面が狭くて、全体がよくわかりませんね。

10110201.png
大体想定通り


全体が見にくいですが、だいたい思い通りにレイアウトできました。一点、「コピー元」の横のボタンの並びが気に入らないので、そこのレイアウトにQLabelをスペーサとして入れときました。

ここまでで実行してみた感じがこちらです。

10110202.png
見た目完了


まあ、見た目はおおむね完了でしょうか。

続いて、ボタンのテキストを変更しようと思いましたが、せっかくなので、英語日本語の両方のリソースを用意してみようかと思い立ちました。いわゆる国際化対応ですね。って、また余計な時間がかかりますね・・。


つづく。




   


ブログを作る(無料) powered by So-netブログ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。