Red de conocimiento informático - Material del sitio web - Cómo utilizar tipos de datos personalizados en Qt

Cómo utilizar tipos de datos personalizados en Qt

Utilice la siguiente estructura para la explicación (aquí no importa si es una estructura o una clase):

struct Player

{

int número;

QString nombre;

QString apellido;

};

QVariante

Para poder utilizar un tipo de datos personalizado, debe declarar este tipo personalizado en el metasistema Qt utilizando Q_DECLARE_METATYPE(). Como se muestra a continuación:

struct Player

{

...

};

Q_DECLARE_METATYPE(Player );

Al pasar un tipo de datos personalizado como QVariant, debe usar QVariant::fromValue() o qVariantFromValue:

Player player;

objeto. - >setProperty("property", QVariant::fromValue(player));

Para facilitar las cosas, puede definir un convertidor de tipo QVariant() en su tipo personalizado:

struct Player

{

...

operador QVariant() const

{

return QVariant: :fromValue(*this);

}

};

Entonces podemos usarlo así:

Jugador jugador;

object->setProperty("property",player);

Señales y ranuras

Para tipos de conexión directa (conexión directa por defecto), no No necesita hacer nada más cuando utiliza un tipo de datos personalizado como parámetro de señal, al igual que los tipos de datos integrados:

connect(sender, SIGNAL(playerCreated(const Player&)), receptor, SLOT(addPlayer (const Player&)));

Pero en una situación entre subprocesos, si aún hace esto, el compilador emitirá una advertencia:

QObject::connect: no puede hacer cola " Player" "Argumentos de tipo

(Asegúrese de que "Player" esté registrado usando qRegisterMetaType().

)

En este punto primero debemos registrar el reproductor:

qRegisterMetaType("Player");?

qRegisterMetaType( ) ;? (Lo anterior es incorrecto a menos que el nombre sea el mismo que el nombre de la clase)

connect(sender, SIGNAL(playerCreated(const Player&)), receptor, SLOT(addPlayer(const Player&)) ;

QDebug

Sería mejor si tuviéramos esto:

qDebug() << player;

En lugar de esto:

qDebug() << "Player(" << player.number << " ," << player.firstName << "," << player.lastName << ")";

¿Qué hacer? Necesitamos sobrecargar el operador QDebug<<:

operador QDebug en línea<<(QDebug debug, const Player& player)

{

debug.nospace () & lt;< "Player("

<< player.number << ","

<< player.firstName << ","

<< player.lastName < << ")";

return debug.space();

}

QDataStream

Al igual que QDebug anterior, necesitaremos sobrecargar el << operador:

operador QDataStream.amp en línea<<(QDataStream& out, const Player& player)

<. p>{

fuera << jugador.número;

en >> jugador.nombre;

en >> jugador.apellido;

en >> jugador .apellido;

regresar en;