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

slotsse 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
slotsnecesaria la palabra clave? Intenté compilar / vincular algunos pequeños programas Qt que llaman a las ranuras sin laslotspalabra clave y se han construido muy bien. Mis experimentos muestran que:signals:es definitivamente necesario,slotspodría ser innecesario yemitparece ser innecesario como he leído en otra parte.slotsno es necesario en Qt5. Qt actualizó laconnect()sintaxis para permitir conectar una señal a una función arbitraria, incluidas lambdas. Por eso,slotsno es necesario. Sin embargo, laslotspalabra clave aún afecta la forma en queQMetaObjectse 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,privatese ignoran para las ranuras Qt. Todas las ranuras son públicas y se pueden conectarfuente
thisla 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
-
signalsyslotsson 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 privadosconnectsin trucos, ¿verdad?