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
qRegisterMetaType
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;