Qt - Очистить старые сигналы - PullRequest
2 голосов
/ 19 июля 2011

Скажем, у меня есть форма A, которая может обрабатывать сигнал x, излучаемый формой B. Когда сигнал x был излучен, форма A что-то делает.Затем я закрываю форму A, снова открываю форму A и жду сигнала x.Однако слот для обработки сигнала x вызывается дважды.Я повторяю закрытие и повторное открытие формы A. слот для обработки сигнала x называется возрастающим числом.

Кажется, что старый сигнал все еще выходит, даже если он был получен.Есть ли способ очистить старый сигнал?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Соединение сигнал / слот не исчезает, когда слот получил сигнал.Не существует концепции «выбрасывать один раз».Кажется, вы подключаете один и тот же сигнал / слот несколько раз.Обратите внимание, что если вы уничтожите форму A, все ее соединения будут отключены автоматически.Поэтому поместите точку останова рядом с оператором connect и проверьте, что происходит.В качестве альтернативы вы можете просто использовать уникальное соединение:

" Qt :: UniqueConnection То же, что и AutoConnection, но соединение устанавливается только в том случае, если оно не дублирует существующее соединение, т. Е. Если оно такое жесигнал уже подключен к тому же слоту для той же пары объектов, затем соединение не будет установлено. Этот тип соединения был введен в Qt 4.6. "

Просто добавьте Qt :: UniqueConnection в качестве последнего аргумента для вас 'Звоните повторно.

1 голос
/ 19 июля 2011

Вам следует разместить ту часть кода, в которой вы открываете / открываете и закрываете форму A.

В соответствии с вашим описанием кажется, что при повторном открытии формы вы фактически создаете новую (другой объект формы)и подключать один и тот же сигнал снова и снова.

Вы должны создать form A только один раз - когда вам это нужно в первый раз - но продолжать использовать во время выполнения вашей программы.При повторном открытии вы должны выполнить только formA->show()

Что-то вроде

void showFormA() {

    if (myFormA == 0 ) {

        myFormA = new FormA(this);
        //connect signals/slots
        //...
    }

    myFormA->show();
}

РЕДАКТИРОВАТЬ:

По поводу вашего вопроса и можете ли вы «очистить» старый сигнал.Смотри http://doc.qt.io/qt-5/qobject.html#disconnect

...