Pergunta

I am subclassing QFileDialog to try to get some custom behavior. I would like to connect to signals emitted by components of the dialog, e.g. the textEdited signal when the file name line edit is manually edited. I understand that QFileDialog emits some signals itself, but these do not cover the cases I would like to respond to.

I have two ways about this I can think of, but don't know how to implement. One is to somehow attain a reference to the component to connect to it's signal. The other would be something with event filters, but the event source is the dialog itself, so I don't know how to determine where mouse clicks or key presses occur.

Are either of these methods feasible? Or another way?

Foi útil?

Solução

Here is one option (your first suggestion):

dialog = QFileDialog()
layout = dialog.layout()
# for i in range(layout.rowCount()):
    # for j in range(layout.columnCount()):
        # try:
            # print i,j
            # print layout.itemAtPosition(i,j).widget()
        # except:
            # pass
line_edit = layout.itemAtPosition(2,1).widget()
line_edit.setText('Hello Stack Overflow')
dialog.exec_()

This gives you access to the QLineEdit in the dialog, which has a bunch of signals you can connect to.

I've also included the code I used to find this widget. I just iterated over the widgets in the layout of the dialog and found the indices of the one I was after. So if you need access to anything else in the dialog, you should be able to find it pretty easily!

Downside to this method: If the layout changes in a future version of Qt, this will break. I suppose you could make the algorithm more robust by looking for widgets that are instances of QLineEdit, but there are always risks with hacky approaches like this!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top