В своем определении конструктора вы написали:
QClipboard *clipBoard = QGuiApplication::clipboard(); // Bad because it shadows FenClient::clipBoard
Вместо этого вы должны были написать:
clipBoard = QGuiApplication::clipboard();
Поскольку clipBoard
является членом поля вашего FenClient
класса Почему вы пытаетесь объявить другую локальную переменную с тем же именем уже существующей (которая, вероятно, останется неинициализированной)?
На самом деле, это, вероятно, причина сбоя clipBoard::blockSignals()
. Вы затеняли свой элемент поля clipBoard
. Другими словами, он никогда не был инициализирован.
Разыменование неинициализированного указателя приводит к неопределенному поведению . Все может случиться, в вашем случае у вас есть кр sh.
Я не прочитал весь ваш код, поэтому он может содержать другие проблемы.
Примечание:
Чтобы удалить соединение, лучше использовать метод QObject::disconnect()
.
Это позволяет вам быть более точным / конкретным c (о том, какие соединения удалить, ...). QObject::blockSignals()
не дает вам такой детализации, так как блокирует все соединения.
Другое дело, вы должны прекратить использовать старые макросы SIGNAL()
и SLOT()
и использовать новый синтаксис слота сигнала вместо.
Итак, в вашем случае соединение будет выглядеть примерно так:
connect(clipBoard, &QClipboard::dataChanged, this, &FenClient::copiage);
И отключение симметрии c:
disconnect(clipBoard, &QClipboard::dataChanged, this, &FenClient::copiage);
Примечание QObject::disconnect()
действительно удаляет соединение, поэтому, если вы хотите восстановить его, вам нужно будет восстановить его, снова вызвав QObject::connect()
.