ここ最近、Cでしか書いていないので、C++のことはずいぶん忘れている。
ちょっと思い出していかないといかん。
Qtの本を読みながらソースを見ていくと、こんな行があった。
newAction->setShortcut(tr("Ctrl+N"));
Ctrlキー+Nキーを押したときに動作するのだ、ということを設定している。
私が思ったのは「Qtって、文字列に書いたら自動的にやってくれるんだねぇ」だった。
しかし、文字列ってことは、誰かがそれを解析していることになる。
解析して、「Ctrl」と「N」に分割して、それをフラグにしてうんたらかんたら、となるはずだ。
そういう処理は、私はあまりお好きではない。
できればフラグで与えてしまって終わり、としたい。
解析にコストをかける必要がないときには、なくしてしまいたい。
では、とQAction::setShortcut()の仕様を見た。
void QAction::setShortcuts ( constQList<QKeySequence> & shortcuts )
void QAction::setShortcuts (QKeySequence::StandardKey key )
この2つしかない。
暗黙で何か行われているようだ。
intやcharなどのプリミティブ型は、よく暗黙でキャストされている。
また、継承関係にあるクラスについても、よくあることだ。
そうでない場合、何かしてやらないといけないと思う。
ここら辺の記憶が曖昧なので、順に見ていこう。
まず、引数から。
tr("Ctrl+N")
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )[static]
trはQObjectクラスのstatic関数で、ほぼすべてのQtクラスはQObjectを継承していると思う。
なので、QObject::をつけずにアクセスできる。
この人は、QStringオブジェクトを返している。
QAction::setShortcuts()は2つあるが、片方はいかにもコンテナって感じなので、気にしなくてよいだろう。
今回呼び出されているのは、引数がQKeySequence::StandardKey型の方のはず。。
QKeySequence::StandardKeyというのは、enumだ。
数値とQStringに互換性はないな・・・。
QKeySequenceクラスにこういうのがあった。
QKeySequence::QKeySequence ( const QString & key )
これは、なんか近いぞ。
QKeySequence::StandardKey型ではなく、QList<QKeySequence>型をとるのだろうか。
QList::QList ( const QList<T> & other )
違うな。
なにかおかしい。。。。
ここでQActionのヘッダを見ていると、こうなっていた。
void setShortcuts(const QList<QKeySequence> &shortcuts);
void setShortcuts(QKeySequence::StandardKey);
やはり、ヘルプに漏れがあるわけではないのか。。。ん?
void setShortcut(const QKeySequence &shortcut);
単数形の関数がある!
しかし、ヘルプにはなかったぞ??
ヘルプ内を検索してみると・・・関数名一覧やショートカットの説明には出てきたけれども、関数詳細には出てきていなかった。
何と言うことだ・・・・。
void | setShortcut ( const QKeySequence & shortcut ) |
はい、こんな実装です。
つまり今回では、QStringが暗黙でQKeySequenceオブジェクトに変換(生成)されていた、というわけだ。
ヘルプで関数仕様がわかれば、たぶんネタにしてなかったお話だ。
引数の型変換ついては「プログラミング言語C++ 第3版」の「11.3.5 コンストラクタと変換」に記載されている。
パフォーマンスに影響がないなら、同じ内容の関数を引数ごとに作るよりも、オブジェクトの自動変換に任せてしまっていいんじゃないの、というところだ。
プログラミング言語C++は、読むのが難しい本だ。
「勉強するんだから原典を読まないと!」と思って買ったものの、詳細がよくわからないときにしか読んでない。
食材買いに出かけるので、本屋に寄ってみましょうかね。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。