Передача класса через настройку сигнала / слота в Qt - PullRequest
2 голосов
/ 26 января 2011

Я пытаюсь получить информацию о нескольких переменных-членах класса на принимающей стороне настройки слота / сигнала, поэтому я хотел бы пропустить весь класс до конца.К сожалению, после прохождения класса переменные-члены кажутся пустыми.Вот некоторые фрагменты кода:

Это устанавливает сигнал для прохождения класса

signals:
    void selected(const ControlIcon *controlIcon);

это соединение слот / сигнал

connect(controllerList->serialController, SIGNAL(selected(const ControlIcon*)),
        infoView, SLOT(serialControllerSelected(const ControlIcon*)));

Я излучаю сигнал отв классе, который будет передан

emit selected(this);

Вот код для вызова данных члена класса

QLabel *ASCIIStringHolder = new QLabel;
ASCIIStringHolder->setText(controlIcon->m_ASCIIString);

Ничего не появляется в метке, и когда я устанавливаю точку останова, яЯ вижу, что внутри m_ASCIIString.

ничего нет. Я посмотрел, чтобы убедиться, что ему изначально был назначен какой-то текст, и это не проблема.Я также попытался настроить сигнал / слот с const.

и без него. Любая помощь будет признательна.

Ответы [ 3 ]

6 голосов
/ 26 января 2011

Механизм сигналов / слотов Qt нуждается в метаинформации о ваших пользовательских типах, чтобы иметь возможность отправлять их в излучаемых сигналах.Для этого зарегистрируйте свой тип с помощью qRegisterMetaType<MyDataType>("MyDataType");

Обратитесь к официальной документации QMetaType для получения дополнительной информации об этом.

0 голосов
/ 27 января 2011

Сигнал не может быть объявлен как передающий класс, а затем фактически передающий потомок этого класса.Я изменил сигнал, слот и connect () на SerialController (потомок ControllerIcon), и все работало нормально.

0 голосов
/ 26 января 2011

Во-первых, поскольку вы используете автоматическое соединение, отправитель и получатель живут в одном потоке? В противном случае может случиться так, что вызов будет поставлен в очередь, и когда он поступит, данные в отправителе уже были изменены. Вы можете попробовать использовать прямое соединение, просто чтобы убедиться, что это не проблема.

Во-вторых, ради забавы, вы пытались получить доступ к отправителю, используя qobject_cast<ControlIcon*>(sender()) внутри слота? Вот как это обычно делается, если сигнал не передает это в качестве аргумента. Как это:

QLabel *ASCIIStringHolder = new QLabel;
// this is instead of the argument to the slot:
ControlIcon *controlIcon = qobject_cast<ControlIcon*>(sender());
ASCIIStringHolder->setText(controlIcon->m_ASCIIString); 
...