Отправка указателя QPixmap через сигнальные слоты, пустые данные растрового изображения

У меня проблема с совместным использованием указателя на Pixmap через механизм сигнального слота. Внутри функции слота у меня есть правильный QPixmap с заполненными данными. В приемнике у меня есть недоступный QPixmap с пустыми данными. Любые идеи?

class A
{
    public:
        A:A():pixmap(0){};
        void fillPixmap()
        {
            // correct Pixmap and data isn't null
        }
    public signals:
        void sendQPixmapToB(QPixmap*);
    private:
        QPixmap *pixmap;
}

class B
{
    public:
        B:B(){};

    public slots:

        void recievePixmap(QPixmap* pixmap)
        {
            // here in debugger pixmap is unaccesible and data is 0
        }
}

void onButtonClicked()
{
    a.fillPixmap();
}

int main()
{
    A a;
    B b;



    .....


    connect(a, SIGNAL(sendQPixmapToB(QPixmap*)),b,SLOT(recievePixmap(QPixmap*)));

    return 0;
}

person Kate Zz    schedule 18.06.2018    source источник
comment
Да. Не используйте указатели с типами данных Qt, копируемыми при записи, за исключением случаев, когда это действительно необходимо и вы точно знаете, почему. Объект QPixmap уже является просто указателем на общие данные.   -  person hyde    schedule 18.06.2018
comment
Я пробовал то же самое с не указателями, тот же результат.   -  person Kate Zz    schedule 18.06.2018
comment
Мы здесь программисты, а не экстрасенсы, мы не обладаем сверхъестественными способностями, необходимыми, чтобы знать, что не так с вашим кодом, не изучая его.   -  person dtech    schedule 18.06.2018
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 18.06.2018
comment
@hyde использовать что-либо — это нормально, если вы знаете, что делаете, использовать что-либо — это плохо, если вы этого не знаете :)   -  person dtech    schedule 18.06.2018
comment
И я также не могу не задаться вопросом, почему этот вопрос был закрыт на основании того, почему этот код не работает, когда он не содержит кода?   -  person dtech    schedule 18.06.2018
comment
@KateZz какую часть Minimal, Complete, and Verifiable example ты не понимаешь? Этот код абсолютно недействителен...   -  person dtech    schedule 18.06.2018
comment
это может быть воспринято как псевдокод, здесь видно, что я пытаюсь объектом b получить доступ к данным растрового изображения   -  person Kate Zz    schedule 18.06.2018
comment
@KateZz, где QXXAplication? return 0; или a.exec();?   -  person eyllanesc    schedule 18.06.2018
comment
@eyllanesc У меня нет проблем с этой частью кода)   -  person Kate Zz    schedule 18.06.2018
comment
@KateZz Пожалуйста, улучшите свой код, мы хотим увидеть, где ошибка, и научить вас, что это неправильно. Проще всего показать вам правильный код, но, вероятно, в другой раз вы спросите то же самое.   -  person eyllanesc    schedule 18.06.2018
comment
@dtech Ну ... я бы сказал, что есть много вещей (обычно называемых анти-шаблонами), которые вы не можете одновременно использовать и в то же время знать, что делаете, думая, что поступаете правильно. . :-)   -  person hyde    schedule 18.06.2018
comment
@katezz В вашем коде, похоже, отсутствует сигнал, поэтому я не знаю, как вообще вызывается слот ... также похоже, что в вашем fillPixmap есть некоторые ошибки. Также похоже, что есть утечка памяти. Или, возможно, оборванный указатель. Или оба.   -  person hyde    schedule 18.06.2018


Ответы (1)


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

#include <QGuiApplication>
#include <QPixmap>
#include <QTimer>

#include <QDebug>

class A: public QObject{
    Q_OBJECT
public:
    using QObject::QObject;

    void sendPixmap(){
        fillPixmap();
        emit sendQPixmapToB(pixmap);
    }
signals:
    void sendQPixmapToB(const QPixmap & pixmap);
private:
    void fillPixmap(){
        pixmap = QPixmap(64, 64);
        pixmap.fill(Qt::red);
    }
    QPixmap pixmap;
};

class B: public QObject{
  Q_OBJECT
public:
    using QObject::QObject;
public slots:
    void recievePixmap(const QPixmap & pixmap){
        qDebug()<<pixmap;
    }
};
int main(int argc, char *argv[])
{
    QGuiApplication a(argc, argv);
    A obja;
    B objb;

    QObject::connect(&obja, &A::sendQPixmapToB, &objb, &B::recievePixmap);

    QTimer::singleShot(1000, &obja, &A::sendPixmap);
    return a.exec();
}

#include "main.moc"·
person eyllanesc    schedule 18.06.2018