crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Сигнал и слот со сложным типом параметра, QStack<QPair <QPoint, QPoint> >
greh
  опции профиля:
сообщение 19.10.2011, 7:29
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Про компиляции на вот такой коннект не ругается:
connect(pathFinder0, SIGNAL(pathFind(QStack<QPair<QPoint,QPoint> >)), this, SLOT(shortPathFound(QStack<QPair<QPoint,QPoint> >)));


Однако при приёме сигнала выдаёт в консоль следущее:
QObject::connect: Cannot queue arguments of type 'QStack<QPair<QPoint,QPoint> >'
(Make sure 'QStack<QPair<QPoint,QPoint> >' is registered using qRegisterMetaType().)


Что он хочет? Будет ли проще и лучше после получения сигнала забирать эти данные из объекта функцией?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 19.10.2011, 8:00
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Добавь
1) #include <QMetaType>
2) qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack");

Если не поможет, попробуй просто qRegisterMetaType<QStack>("Stack"), хотя врятли.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 19.10.2011, 9:08
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Snake174 @ 19.10.2011, 11:00) *
Добавь
1) #include <QMetaType>
2) qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack");

Если не поможет, попробуй просто qRegisterMetaType<QStack>("Stack"), хотя врятли.

А как его потом использовать? В заголовочных файлах менять описание сиглналов/слотов? И вообще зачем всё это (почему оно не работает без этой магии)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 19.10.2011, 10:07
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Это надо для системы метакомпиляции Qt. В ассистанте есть подробные разъяснения зачем оно надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 19.10.2011, 10:45
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Цитата(greh @ 19.10.2011, 9:08) *
В заголовочных файлах менять описание сиглналов/слотов?

Ничего менять не надо. qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack"); поставь в конструктор или ещё куда, главное до посыла сигнала.

Цитата(greh @ 19.10.2011, 9:08) *
(почему оно не работает без этой магии)?

А почему "оно" вообще не делает всё за тебя?

mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
  qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack");

  QPushButton *pathFinder0 = new QPushButton("sdf", this);
  connect(pathFinder0, SIGNAL(pathFind(QStack<QPair<QPoint,QPoint> >)), this, SLOT(shortPathFound(QStack<QPair<QPoint,QPoint> >)));
}

MainWindow::~MainWindow()
{
}


mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QMetaType>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
greh
  опции профиля:
сообщение 19.10.2011, 12:04
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 23.11.2009
Пользователь №: 1252

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Snake174 @ 19.10.2011, 13:45) *
Ничего менять не надо. qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack"); поставь в конструктор или ещё куда, главное до посыла сигнала.


qRegisterMetaType< QStack<QPair<QPoint,QPoint> > >("Stack"); // не помогло

qRegisterMetaType<QStack>("Stack"); // не компилируется error: no matching function for call to ‘qRegisterMetaType(const char [6])’


Я наверное вытащу через функцию эти данные, будет куда проще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 20.10.2011, 4:39
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Ну или как вариант ещё использовать typedef:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QMetaType>

typedef QStack<QPair<QPoint, QPoint> > Stack;

class MainWindow : public QMainWindow
{
  Q_OBJECT

  public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

signals:
  void pathFind( Stack );
};

#endif // MAINWINDOW_H


#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
  qRegisterMetaType<Stack>("Stack");

  QPushButton *pathFinder0 = new QPushButton("sdf", this);
  connect(pathFinder0, SIGNAL(pathFind(Stack)), this, SLOT(shortPathFound(Stack)));
}

MainWindow::~MainWindow()
{
}


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 23:05