Entiendo cómo usarlo, pero su sintaxis me molesta. ¿Qué está haciendo "Private Slots:"?
Nunca antes había visto algo entre la palabra clave privada y: en una definición de clase. ¿Hay algo de magia elegante en C ++ aquí?
Y ejemplo aquí:
#include <QObject>
class Counter : public QObject
{
Q_OBJECT
public:
Counter() { m_value = 0; }
int value() const { return m_value; }
public slots:
void setValue(int value);
...
c++
qt
signals-slots
Justin
fuente
fuente
slots
se define como#define slots
. Al compilar usando Qt MOC, genera código para el compilador de C ++.Respuestas:
Las ranuras son una extensión específica de Qt de C ++. Solo se compila después de enviar el código a través del preprocesador de Qt, el compilador de metaobjetos (moc). Consulte http://doc.qt.io/qt-5/moc.html para obtener documentación.
Editar: como señala Frank, solo se requiere moc para vincular. Las palabras clave adicionales se #definen con el preprocesador estándar.
fuente
slots
necesaria la palabra clave? Intenté compilar / vincular algunos pequeños programas Qt que llaman a las ranuras sin laslots
palabra clave y se han construido muy bien. Mis experimentos muestran que:signals:
es definitivamente necesario,slots
podría ser innecesario yemit
parece ser innecesario como he leído en otra parte.slots
no es necesario en Qt5. Qt actualizó laconnect()
sintaxis para permitir conectar una señal a una función arbitraria, incluidas lambdas. Por eso,slots
no es necesario. Sin embargo, laslots
palabra clave aún afecta la forma en queQMetaObject
se construye un objeto .moc
(también conocido como el "compilador de metaobjetos") no reconocerá un método como una ranura a menos que esté dentro de laslots:
sección de una definición de clase. Entonces, aunque la conexión seguirá funcionando, el método no se mostrará en las herramientas de introspección.Las palabras clave como
public
,private
se ignoran para las ranuras Qt. Todas las ranuras son públicas y se pueden conectarfuente
this
la forma en que estamos familiarizados.Declarar las tragamonedas como privadas significa que no podrá hacer referencia a ellas desde el contexto en el que son privadas, como cualquier otro método. En consecuencia, no podrá transferir direcciones de ranuras privadas
connect
.Si declara la señal como privada, está diciendo que solo esta clase puede administrarla, pero los punteros de miembros de función no tienen restricciones de acceso :
class A{ private: void e(){ } public: auto getPointer(){ return &A::e; } }; int main() { A a; auto P=a.getPointer(); (a.*P)(); }
Aparte de eso, lo que mencionan otras respuestas también es válido:
- todavía puede conectar señales privadas y ranuras desde el exterior con trucos
-
signals
yslots
son macros vacías y no rompen el estándar del lenguajefuente
slots
útil la declaración, que es una macro. No puedo conectar punteros de función de ranura privadosconnect
sin trucos, ¿verdad?