0

メイン ウィンドウ ( QMainWindow) にQTableView(という名前のcommandsTableView) があります。ここで、選択の変更に対応したいと思います。

スロットを作成し、手動で に接続しましたui.commandsTableView->selectionModel()。すべて正常に動作します。

しかし、私は考えました:自動接続を使用しないのはなぜですか (特に、より多くの接続を行う必要があるため)。少なくとも、一貫した命名規則に力を加えるでしょう。

それでも、適切な名前の構文を見つけることができませんでした。私は試した:

  • on_commandsTableView_selectionModel_selectionChanged
  • on_commandsTableViewSelectionModel_selectionChanged
  • on_commandsTableView_selectionChanged
  • on_commandsTableView___selectionChanged

しかし、どちらも機能しませんでした。すべての場合において、アプリの実行時に出力にメッセージが表示されます (対応するスロット名とともに、ここでは最初に例としてのみ示します)。

QMetaObject::connectSlotsByName: No matching signal for on_commandsTableView_selectionModel_selectionChanged(QItemSelection,QItemSelection)

(接続エラーに対する応答にアサーションがないのはなぜですか?私には理解できません。出力にこれらのメッセージや同様のメッセージが表示されるまで、何が問題なのかを考えるのに多くの時間を費やしました。)

によって返されたオブジェクトui.commandsTableView->selectionModel()の名前が空です。ただしselectionModel、呼び出しを行う前にに設定しconnectSlotsByNameても、どちらも役に立ちません。

4

2 に答える 2

1

ドキュメント によると、次のconnectSlotsByName()ような署名のみをサポートしています

void on_<object name>_<signal name>(<signal parameters>);

ソースによると、それがチェックする唯一のフォームです (子のリストを収集し、親のメソッド名を子の名前と照合する方法を見てください)。

したがって、自動接続を使用できるようにするには、名前付きの選択モデルが必要でした。これは、呼び出しからそれconnectSlotsByName()以降も存在し続けます。選択モデル (可能性は低い) またはモデル (可能性が高い) を変更するたびに、選択モデルに名前を付けて、再度自動接続する必要があります。しかし残念connectSlotsByName()ながら、接続が一意であるかどうかをチェックしていないように見えるため、他のすべての接続が複製されます。そのため、モデル、シーンなどの動的な子に信号を手動で接続する必要があります。

于 2012-09-18T08:50:07.030 に答える
0

だと思います

on_selectionModel_selectionChanged(const QItemSelection & selected, const QItemSelection & deselected)
于 2012-09-17T20:18:43.860 に答える