2012/01/15

[qt]Qt Designerで作成したスロットを消すときは、ヘッダファイルから宣言を消す

Quitメニューを作った。
これを選択したときに、MainWindowのcloseスロットが呼ばれるようにした。

・・・と思ってアクションエディタから「スロットへ移動...」とし、シグナルとしてtriggered()を選択すると、メンバ関数ができた。
いや、やりたいのはこれじゃないのだ・・・。

 

メンバ関数を削除して、シグナル/スロットエディタで追加した。
Quitメニューで右クリックしても、スロットを選択できそうな選択肢が出てこないのだ。
まあ、デザイン画面ではアクションを割り当てるのみで、アクションがどういうふうに動くのかはシグナル/スロットエディタなどで設定するということなのだろう。

 

それはよかったのだが、コンパイルするとエラーになった。
on_action_Quit_triggered()がない、と怒られた。
あー、これはさっき削除したメンバ関数だな。
エラーになったのはmocファイルなので、qmakeか何かが自動生成している部分だ。
だから、mocファイルを変更しても意味がない。
一度作ったスロットをやめるにはどうしたらいいのだろうか?


これは、ヘッダファイルの「private slots:」にあるon_action_Quit_triggered()を削除する必要がある。
mocはヘッダファイルから情報を集めてくるから、そういうことになるのだ。

 

GUIのツールは便利なのだが、一度行った操作の取り消し方法も把握しておかないと自由に使えないからな。


本当は、Quitアクションをメニューに追加するのではなく、メニューの項目(FileとかEditとかみたいな項目)をQuitにし、押したらアプリが終了するようにしたかったのだ。

GUIで操作する限りでは、いきなりアクションを割り当てることはできないように思う。
メニューの項目はQMenuで、アクションはQAction。
メニューはQMenuBar。
QMenuBarには、addMenu()もaddAction()もあるなぁ。
しかし、ウィジェット一覧にはActionがないし、アクションエディタからメニューバーにD&Dしても拒否される。

コンストラクタにこんな行を追加した。

ui->menuBar->addAction(ui->action_Quit);

こうすると、期待する動作になった。
そういうものか。

 

Qt Creatorのテキストエディタは、メンバ関数などのサポート情報がTipsとして表示されるのだが、QMenuBar::addAction()にある3つのオーバーライド定義のうち、2つしか表示されなかった。
上記のメンバ関数は、表示されなかったメンバ関数なのだ。

QMenuBarという文字列の上でF2キーを押すと、qmenubar.hが表示された。
こんな定義になっている。

#ifdef Q_NO_USING_KEYWORD
void addAction(QAction *action) { QWidget::addAction(action); }
#else
using QWidget::addAction;
#endif
QAction *addAction(const QString &text);
QAction *addAction(const QString &text, const QObject *receiver, const char* member);

#ifdefがあるソースでは、Tipsが表示されないのかもしれない。

気になるのは「Q_NO_USING_KEYWORD」というもの。
「キーボードを使わない」という定義だろうか?
まあ、QWidget::addAction()があるので、そちらが呼ばれたと考えてもよいのではあるが、気になる。

ちがうちがう。
キーワード、だ。
global.hに定義が見られるのでコメントを読むと、どうもコンパイラによってはusingをうまく処理できないものがあるから、ifdefでわざわざ対応しているということらしい。
それならば、納得だ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。