You can use QModelIndex::data() with the role Qt::CheckStateRole to determine the checked status of the checkbox on the QItemSelection returned by your QItemSelectionModel.

You might need to keep a separate data structure that keeps track of which items are checked so you can compare the old state and the new state. If the state changes on a click, then you can skip the code that opens the information window.

By default, any click on any part of a row in a tree view changes the selection, so clicking the checkbox or anything else will cause the QItemSelection to change. The only way you can distinguish between a checkbox click and an actual selection change is with extra code.

You could also derive a custom QItemSelectionModel and override the QItemSelectionModel::select() slots. In your implementation, you can check the status of the check box and emit a new signal (something like checkStateChanged( const QModelIndex & )) if the state has changed or call QItemSelectionModel::emitSelectionChanged() if it is a row change. Your top level code could then look for the two different signals.