<listitem><para>L'anticipació negativa prevé una possible coincidència si la següent part de la cadena coincideix amb el <emphasis>PATRÓ</emphasis>.</para>
<listitem><para>L'anticipació negativa prevé una possible coincidència si la següent part de la cadena coincideix amb el <emphasis>PATRÓ</emphasis>.</para>
<para>L'expressió <userinput>const \w+\b(?!\s*&)</userinput> coincidirà amb <quote>const char</quote> en la cadena <quote>const char* foo</quote>, mentre que no coincidirà amb <quote>const QString</quote> en <quote>const QString& bar</quote>, atès que el <quote>&</quote> coincideix amb el patró de la declaració d'anticipació negativa.</para>
<para>L'expressió <userinput>const \w+\b(?!\s*&)</userinput> coincidirà amb <quote>const char</quote> en la cadena <quote>const char* foo</quote>, mentre que no coincidirà amb <quote>const TQString</quote> en <quote>const TQString& bar</quote>, atès que el <quote>&</quote> coincideix amb el patró de la declaració d'anticipació negativa.</para>
@ -501,7 +501,7 @@ Welcome Text = S'està carregant el KDE
<para>Abans de que la vostra aplicació comenci un intensiu treball de càlcul, o abans de que comenci a carregar els connectors, &etc;, invoqueu a &ksplash; tal i com segueix:</para>
<para>Abans de que la vostra aplicació comenci un intensiu treball de càlcul, o abans de que comenci a carregar els connectors, &etc;, invoqueu a &ksplash; tal i com segueix:</para>
<listitem><para>Les classes del connector hauran de proveir una funció <literal>static</literal> anomenada <function>names</function> que retorni una llista de noms per als quals ha estat invocada.</para></listitem>
<listitem><para>Les classes del connector hauran de proveir una funció <literal>static</literal> anomenada <function>names</function> que retorni una llista de noms per als quals ha estat invocada.</para></listitem>
<listitem><para>Si el connector es pot configurar en el mòdul del centre de control, aquest haurà de proveir una classe <literal>ThemeEngineConfig</literal> per a la configuració.</para></listitem>
<listitem><para>Si el connector es pot configurar en el mòdul del centre de control, aquest haurà de proveir una classe <literal>ThemeEngineConfig</literal> per a la configuració.</para></listitem>
<listitem><para>La classe del connector haurà de solapar a almenys una de les funcions virtuals <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> i <function>slotUpdateSteps</function> per a fer-se usable.</para></listitem>
<listitem><para>La classe del connector haurà de solapar a almenys una de les funcions virtuals <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> i <function>slotUpdateSteps</function> per a fer-se usable.</para></listitem>
<listitem><para>El constructor ha de prendre la forma <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> de manera que sigui emprat amb <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>El constructor ha de prendre la forma <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> de manera que sigui emprat amb <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>L'últim requeriment podria ser complicat, però, tal i com veurem més endavant, afegint una simple línia als vostres fitxers font, usualment podreu ignorar-lo.</para>
<para>L'últim requeriment podria ser complicat, però, tal i com veurem més endavant, afegint una simple línia als vostres fitxers font, usualment podreu ignorar-lo.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Analitzem l'anterior llistat. La classe <classname>Theme2k</classname> satisfà les convencions de nom, i és inherent de <classname>ThemeEngine</classname>. Aquesta proveeix un <methodname>Theme2k::names()</methodname>, i disposa d'un constructor que pren els paràmetres requerits: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> i també proveeix d'un mètode <methodname>Theme2k::slotSetText()</methodname> simple. De moment, no us preocupeu per la classe <classname>RotWidget</classname>. Aquesta és un petit estri (en anglès "widjet") que proveeix d'alguns afegits visuals per l'usuari. El nostre connector és molt simple i no mostra cap icona o barra de progrés. Si us agradaria mostrar icones, solapeu la funció <function>slotSetPixmap</function>. Existeixen funcions similars per establir el rang de la barra de progrés (<function>slotUpdateSteps</function>) i l'increment de la passa actual (<function>slotUpdateProgress</function>). </para>
<para>Analitzem l'anterior llistat. La classe <classname>Theme2k</classname> satisfà les convencions de nom, i és inherent de <classname>ThemeEngine</classname>. Aquesta proveeix un <methodname>Theme2k::names()</methodname>, i disposa d'un constructor que pren els paràmetres requerits: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> i també proveeix d'un mètode <methodname>Theme2k::slotSetText()</methodname> simple. De moment, no us preocupeu per la classe <classname>RotWidget</classname>. Aquesta és un petit estri (en anglès "widjet") que proveeix d'alguns afegits visuals per l'usuari. El nostre connector és molt simple i no mostra cap icona o barra de progrés. Si us agradaria mostrar icones, solapeu la funció <function>slotSetPixmap</function>. Existeixen funcions similars per establir el rang de la barra de progrés (<function>slotUpdateSteps</function>) i l'increment de la passa actual (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementació del connector</title>
<title>Implementació del connector</title>
@ -686,7 +686,7 @@ private:
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> està declarada dintre de <filename>kgenericfactory.h</filename>. D'ara en endavant el constructor! Atès que aquest és un connector molt simple, el constructor serà molt minimalista.</para>
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> està declarada dintre de <filename>kgenericfactory.h</filename>. D'ara en endavant el constructor! Atès que aquest és un connector molt simple, el constructor serà molt minimalista.</para>
<para>La interfície <abbrev>DCOP</abbrev> de &kstars; inclou les següents funcions: <itemizedlist>
<para>La interfície <abbrev>DCOP</abbrev> de &kstars; inclou les següents funcions: <itemizedlist>
<listitem><para><function> lookTowards( const QString direcció )</function>: Apunta la vista del focus en una direcció especificada per l'argument. Aquest pot ser el nom d'un objecte en el cel o una de les següents paraules (o abreviacions) direccionals: zenith (z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direcció )</function>: Apunta la vista del focus en una direcció especificada per l'argument. Aquest pot ser el nom d'un objecte en el cel o una de les següents paraules (o abreviacions) direccionals: zenith (z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: Apunta la vista del focus cap a les coordenades equatorials especificades. </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: Apunta la vista del focus cap a les coordenades equatorials especificades. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Pausa durant t segons abans de continuar amb els subsegüents comandaments a l'script. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Pausa durant t segons abans de continuar amb els subsegüents comandaments a l'script. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Atura l'execució de l'script fins que l'usuari premi la tecla especificada. En aquest punt, no podreu especificar uns combinació de tecles (tals com <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); sinó emprar tecles simples. Podeu escriure <quote>space</quote> per a indicar la barra d'espai. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Atura l'execució de l'script fins que l'usuari premi la tecla especificada. En aquest punt, no podreu especificar uns combinació de tecles (tals com <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); sinó emprar tecles simples. Podeu escriure <quote>space</quote> per a indicar la barra d'espai. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Permet decidir si el mode de seguiment està en marxa. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Permet decidir si el mode de seguiment està en marxa. </para></listitem>
<listitem><para><function> changeViewOption( const QString opció, const QString valor )</function>: Ajusta una opció de la vista. Hi ha dotzenes i dotzenes d'opcions disponibles; bàsicament tot el que podeu canviar en la finestra <guilabel>Opcions de la vista</guilabel> també es poden canviar aquí. El primer argument és el nom de l'opció (els noms es prenen del fitxer de configuració <filename>kstarsrc</filename>) i el segon argument és el valor desitjat. L'analitzador d'arguments està dissenyat per a ser robust, de manera que si accidentament li envieu dades errònees ell fallarà amb gràcia. </para></listitem>
<listitem><para><function> changeViewOption( const TQString opció, const TQString valor )</function>: Ajusta una opció de la vista. Hi ha dotzenes i dotzenes d'opcions disponibles; bàsicament tot el que podeu canviar en la finestra <guilabel>Opcions de la vista</guilabel> també es poden canviar aquí. El primer argument és el nom de l'opció (els noms es prenen del fitxer de configuració <filename>kstarsrc</filename>) i el segon argument és el valor desitjat. L'analitzador d'arguments està dissenyat per a ser robust, de manera que si accidentament li envieu dades errònees ell fallarà amb gràcia. </para></listitem>
<listitem><para><function> setGeoLocation( const QString ciutat, const QString provincia, const QString ciutat )</function>: Canvia la localització d'observació a la ciutat especificada. Si no es troba cap ciutat que hi cassi, llavores no succeirà res. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString ciutat, const TQString provincia, const TQString ciutat )</function>: Canvia la localització d'observació a la ciutat especificada. Si no es troba cap ciutat que hi cassi, llavores no succeirà res. </para></listitem>
<listitem><para><function> stop()</function> {rellotge]: Atura el rellotge de simulació. </para></listitem>
<listitem><para><function> stop()</function> {rellotge]: Atura el rellotge de simulació. </para></listitem>
<listitem><para>Den negative fremadskuen forhindrer en mulig match i at blive anerkendt hvis den følgende del af den søgte streng ikke matcher dens <emphasis>PATTERN</emphasis>.</para>
<listitem><para>Den negative fremadskuen forhindrer en mulig match i at blive anerkendt hvis den følgende del af den søgte streng ikke matcher dens <emphasis>PATTERN</emphasis>.</para>
<para>Udtrykket <userinput>const \w+\b(?!\s*&)</userinput> vil matche ved <quote>const char</quote> i strengen <quote>const char* foo</quote> men den ikke kan matche <quote>const QString</quote> i <quote>const QString& bar</quote> fordi <quote>&</quote> matcher den negative fremadskuen påstandsmønster.</para>
<para>Udtrykket <userinput>const \w+\b(?!\s*&)</userinput> vil matche ved <quote>const char</quote> i strengen <quote>const char* foo</quote> men den ikke kan matche <quote>const TQString</quote> i <quote>const TQString& bar</quote> fordi <quote>&</quote> matcher den negative fremadskuen påstandsmønster.</para>
<para>Før dit program starter sit beregningsintensive arbejde, eller før det begynder med at indlæse plugin, &etc;, startes &ksplash; som følger:</para>
<para>Før dit program starter sit beregningsintensive arbejde, eller før det begynder med at indlæse plugin, &etc;, startes &ksplash; som følger:</para>
<listitem><para>Plugin-klasser skal sørge for en <literal>statisk</literal> funktion der hedder <function>names</function> der returnerer en liste af navne ved hvilke de kan startes.</para></listitem>
<listitem><para>Plugin-klasser skal sørge for en <literal>statisk</literal> funktion der hedder <function>names</function> der returnerer en liste af navne ved hvilke de kan startes.</para></listitem>
<listitem><para>Hvis dit plugin kan indstilles i kontrolcenter-modulet, skal det sørge for en <literal>ThemeEngineConfig</literal>-baseret klasse for indstillingen.</para></listitem>
<listitem><para>Hvis dit plugin kan indstilles i kontrolcenter-modulet, skal det sørge for en <literal>ThemeEngineConfig</literal>-baseret klasse for indstillingen.</para></listitem>
<listitem><para>Plugin-klasser skal gå forud for mindst en af de virtuelle funktioner <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> og <function>slotUpdateSteps</function> for at være brugbare.</para></listitem>
<listitem><para>Plugin-klasser skal gå forud for mindst en af de virtuelle funktioner <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> og <function>slotUpdateSteps</function> for at være brugbare.</para></listitem>
<listitem><para>Konstruktøren skal være på formen <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> så den kan bruges med <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Konstruktøren skal være på formen <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> så den kan bruges med <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>Det sidste krav synes måske kompliceret, men, som vi skal se senere, du kan sædvanligvis ignorere det ved at tilføje en enkelt linje til din kildefil.</para>
<para>Det sidste krav synes måske kompliceret, men, som vi skal se senere, du kan sædvanligvis ignorere det ved at tilføje en enkelt linje til din kildefil.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Lad os analysere ovenstående. <classname>Theme2k</classname>-klassen tilfredsstiller navnekonventionerne, og er arvet fra <classname>ThemeEngine</classname>. Den sørger for en <methodname>Theme2k::names()</methodname>, og har en konstruktør der tager de krævede parametre: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> og sørger også for en simpel <methodname>Theme2k::slotSetText()</methodname> metode. Indtil videre bekymrer vi os ikke om <classname>RotWidget</classname>-klassen. Det er en lille kontrol der sørger for nogle øjenlækkerier for brugeren. Vores plugin er meget simpelt og viser ikke nogen ikoner og har ingen fremgangslinje. Hvis du gerne vil vise ikoner, så sæt <function>slotSetPixmap</function>-funktionen ud af kraft. Lignende funktioner eksisterer til at sætte fremgangslinjens område (<function>slotUpdateSteps</function>) og til at forøge (<function>slotUpdateProgress</function>) det nuværende skridt. </para>
<para>Lad os analysere ovenstående. <classname>Theme2k</classname>-klassen tilfredsstiller navnekonventionerne, og er arvet fra <classname>ThemeEngine</classname>. Den sørger for en <methodname>Theme2k::names()</methodname>, og har en konstruktør der tager de krævede parametre: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> og sørger også for en simpel <methodname>Theme2k::slotSetText()</methodname> metode. Indtil videre bekymrer vi os ikke om <classname>RotWidget</classname>-klassen. Det er en lille kontrol der sørger for nogle øjenlækkerier for brugeren. Vores plugin er meget simpelt og viser ikke nogen ikoner og har ingen fremgangslinje. Hvis du gerne vil vise ikoner, så sæt <function>slotSetPixmap</function>-funktionen ud af kraft. Lignende funktioner eksisterer til at sætte fremgangslinjens område (<function>slotUpdateSteps</function>) og til at forøge (<function>slotUpdateProgress</function>) det nuværende skridt. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementation af plugin</title>
<title>Implementation af plugin</title>
@ -686,7 +686,7 @@ private:
<para>Makroen <constant>K_EXPORT_COMPONENT_FACTORY</constant> erklæres i <filename>kgenericfactory.h</filename>. Videre til konstruktøren! Da dette er et meget simpelt plugin, er konstruktøren temmelig ligetil.</para>
<para>Makroen <constant>K_EXPORT_COMPONENT_FACTORY</constant> erklæres i <filename>kgenericfactory.h</filename>. Videre til konstruktøren! Da dette er et meget simpelt plugin, er konstruktøren temmelig ligetil.</para>
<para>&kstars; <abbrev>DCOP</abbrev>-grænseflade indeholder følgende funktioner: <itemizedlist>
<para>&kstars; <abbrev>DCOP</abbrev>-grænseflade indeholder følgende funktioner: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: Drejer stjernekortet i den retning funktionens argument angiver. Det kan være navnet på ethvert objekt på himlen eller et af fælgende retningsord eller forkortelser: zenit (eller z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: Drejer stjernekortet i den retning funktionens argument angiver. Det kan være navnet på ethvert objekt på himlen eller et af fælgende retningsord eller forkortelser: zenit (eller z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Drejer stjernekortet i retning af de angivne koordinater i ækvatorsystemet. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Drejer stjernekortet i retning af de angivne koordinater i ækvatorsystemet. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Hold pause i t sekunder før de næste kommandoer i scriptet udføres. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Hold pause i t sekunder før de næste kommandoer i scriptet udføres. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Stop udførelsen af scriptet indtil brugeren trykker på en bestemt tast. På nuværende tidspunkt kan man kun bruge enkelttaster ikke tastekombinationer (som f.eks. <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>). Skriv <quote>space</quote> for at bruge mellemrumstasten. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Stop udførelsen af scriptet indtil brugeren trykker på en bestemt tast. På nuværende tidspunkt kan man kun bruge enkelttaster ikke tastekombinationer (som f.eks. <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>). Skriv <quote>space</quote> for at bruge mellemrumstasten. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Slår følgning af et objekt til og fra. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Slår følgning af et objekt til og fra. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Tilret en visningsindstilling. Der er mange indstillinger der kan tilrettes. Alle indstillinger der kan ændres i vinduet <guilabel>Indstil &kstars;</guilabel> kan tilrettes her også. Det første argument er indstillingens navn (navnene tages fra opsætningsfilen <filename>kstarsrc</filename>). Det andet argument er den værdi du vil give indstillingen. Argumentbehandlingen er skrevet så den skulle være solid, så hvis du skriver noget forkert skulle den fejle på en pæn måde. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Tilret en visningsindstilling. Der er mange indstillinger der kan tilrettes. Alle indstillinger der kan ændres i vinduet <guilabel>Indstil &kstars;</guilabel> kan tilrettes her også. Det første argument er indstillingens navn (navnene tages fra opsætningsfilen <filename>kstarsrc</filename>). Det andet argument er den værdi du vil give indstillingen. Argumentbehandlingen er skrevet så den skulle være solid, så hvis du skriver noget forkert skulle den fejle på en pæn måde. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Ændrer det sted himlen ses fra til den angivne by. Hvis den ikke findes i KStars sker der ingenting. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Ændrer det sted himlen ses fra til den angivne by. Hvis den ikke findes i KStars sker der ingenting. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Stopper tiden i simuleringen. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Stopper tiden i simuleringen. </para></listitem>
<listitem><para>Generiske enhedsfunktioner: Funktioner til at oprette eller lukke af for enheder, osv.</para>
<listitem><para>Generiske enhedsfunktioner: Funktioner til at oprette eller lukke af for enheder, osv.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString deviceName, bool useLocal)</function>: Opret en INDI-enhed enten i lokaltilstand eller i servertilstand.</para></listitem>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function>: Opret en INDI-enhed enten i lokaltilstand eller i servertilstand.</para></listitem>
<listitem><para><function>shutdownINDI (QString deviceName)</function>: Luk af for en INDI-enhed.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function>: Luk af for en INDI-enhed.</para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function>: Forbind eller afbryd en INDI-enhed.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function>: Forbind eller afbryd en INDI-enhed.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function>: Aktivér en INDI-handling. Handlingen kan være et hvilket som helst <emphasis>element</emphasis> i en <emphasis>skifteegenskab</emphasis>.</para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function>: Aktivér en INDI-handling. Handlingen kan være et hvilket som helst <emphasis>element</emphasis> i en <emphasis>skifteegenskab</emphasis>.</para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function>: Hold pause i kørsel af scriptet til angiven <emphasis>handlingsegenskab</emphasis> returnerer med status O.k.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function>: Hold pause i kørsel af scriptet til angiven <emphasis>handlingsegenskab</emphasis> returnerer med status O.k.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Teleskopfunktioner: Funktioner til at styre teleskopbevægelser og status.</para>
<listitem><para>Teleskopfunktioner: Funktioner til at styre teleskopbevægelser og status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function>: Indstil teleskopets tilstand eller handling. Tilgængelige tilvalg er SLEW, TRACK, SYNC, PARK og ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function>: Indstil teleskopets tilstand eller handling. Tilgængelige tilvalg er SLEW, TRACK, SYNC, PARK og ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function>: Indstil teleskopets JNow-målkoordinater til <emphasis>RA</emphasis> og <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function>: Indstil teleskopets JNow-målkoordinater til <emphasis>RA</emphasis> og <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString deviceName, QString objectName)</function>: Indstil teleskopets JNow-målkoordinater til koordinaterne for <emphasis>objectName</emphasis>. Kstars slår objektnavnet op i sin database og henter RA og DEC når de er fundet.</para></listitem>
<listitem><para><function>setINDITargetName(TQString deviceName, TQString objectName)</function>: Indstil teleskopets JNow-målkoordinater til koordinaterne for <emphasis>objectName</emphasis>. Kstars slår objektnavnet op i sin database og henter RA og DEC når de er fundet.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function>: Sæt teleskopets geografiske sted til de længdegrader og breddegrader som angives. Længdegraden måles mod øst fra Greenwich, i Storbritannien. Selvom det er almindeligt at bruge negative længdegrader for den vestlige halvklode, kræver INDI imidlertid længdegrader mellem 0 og 360 grader. Hvis du har en negative længdegrad, så læg blot 360 grader til for at få værdien som INDI forventer sig. For eksempel har Calgary i Canada følgende koordinater i KStars: Længdegrad -114 04 58 og breddegrad 51 02 58. Altså ville INDI behøve længdegraden 360 - 114,069 = 245,917 grader.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function>: Sæt teleskopets geografiske sted til de længdegrader og breddegrader som angives. Længdegraden måles mod øst fra Greenwich, i Storbritannien. Selvom det er almindeligt at bruge negative længdegrader for den vestlige halvklode, kræver INDI imidlertid længdegrader mellem 0 og 360 grader. Hvis du har en negative længdegrad, så læg blot 360 grader til for at få værdien som INDI forventer sig. For eksempel har Calgary i Canada følgende koordinater i KStars: Længdegrad -114 04 58 og breddegrad 51 02 58. Altså ville INDI behøve længdegraden 360 - 114,069 = 245,917 grader.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function>: Indstil teleskopets UTC-tid i ISO 8601-format. Formatet er ÅÅÅÅ/MM/DDTTT:MM:SS.(f.eks. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function>: Indstil teleskopets UTC-tid i ISO 8601-format. Formatet er ÅÅÅÅ/MM/DDTTT:MM:SS.(f.eks. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Kamera/CCD-funktioner: Funktioner til at styre kamera/CCD-egenskaber og status.</para>
<listitem><para>Kamera/CCD-funktioner: Funktioner til at styre kamera/CCD-egenskaber og status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function>: Indstil CCD-kredsens måltemperatur i grader Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function>: Indstil CCD-kredsens måltemperatur i grader Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString deviceName, QString type)</function>: Indstil CCD-rammetype. Tilgængelige tilvalg er FRAME_LIGHT, FRAME_BIAS, FRAME_DARK og FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function>: Indstil CCD-rammetype. Tilgængelige tilvalg er FRAME_LIGHT, FRAME_BIAS, FRAME_DARK og FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function>: Start eksponering med CCD eller kamera med længden som angives af <emphasis>timeout</emphasis> i sekunder.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function>: Start eksponering med CCD eller kamera med længden som angives af <emphasis>timeout</emphasis> i sekunder.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fokuseringsfunktioner: Funktioner til at styre fokuseringsenhedens bevægelse og status.</para>
<listitem><para>Fokuseringsfunktioner: Funktioner til at styre fokuseringsenhedens bevægelse og status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function>: Angiv fokuseringsenhedens hastighed. Tilgængelige tilvalg er FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM og FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function>: Angiv fokuseringsenhedens hastighed. Tilgængelige tilvalg er FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM og FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function>: Indstil tidsgrænsen i sekunder for alle følgende startINDIFocus-handlinger.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function>: Indstil tidsgrænsen i sekunder for alle følgende startINDIFocus-handlinger.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function>: Flyt enten fokuseringsenheden indad (focusDir = 0) eller udad (focusDir = 1). Handlingens hastighed og varighed angives af funktionerne <function>setINDIFocusSpeed()</function> og <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function>: Flyt enten fokuseringsenheden indad (focusDir = 0) eller udad (focusDir = 1). Handlingens hastighed og varighed angives af funktionerne <function>setINDIFocusSpeed()</function> og <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Filterfunktioner: Funktioner til at kontrollere filterpositioner.</para>
<listitem><para>Filterfunktioner: Funktioner til at kontrollere filterpositioner.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function>: Ændr filterposition til <varname>filter_num</varname>. Brugeren kan tildele alias for filternummer i dialogen <guimenuitem>Indstil INDI</guimenuitem> under menuen <guimenu>Enheder</guimenu> (f.eks. Filter 1 = Rød, Filter 2 = Grøn, etc.).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function>: Ændr filterposition til <varname>filter_num</varname>. Brugeren kan tildele alias for filternummer i dialogen <guimenuitem>Indstil INDI</guimenuitem> under menuen <guimenu>Enheder</guimenu> (f.eks. Filter 1 = Rød, Filter 2 = Grøn, etc.).</para></listitem>
<para>Du kan få en liste med tilgængelige &DCOP;-grænseflader, for at bruge de rigtige flag, som vist i dette eksempel: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Du kan få en liste med tilgængelige &DCOP;-grænseflader, for at bruge de rigtige flag, som vist i dette eksempel: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>er noget anderledes end at følge en NULL-peger. Du fortalte slet ikke objektet hvad det er, og nu forsøger du at bruge det. Gætværket her er at du vil have en ny lokal instans af et Arts::Synth_PLAY-objekt. Du kan naturligvis have villet gøre noget andet (såsom at oprette objektet et andet sted, eller bruge et eksisterende fjernobjekt). Det er i alle tilfælde en bekvem genvej til at oprette objekter. At oprette et objekt når det først bruges virker ikke når du allerede har tildelt det til noget andet (som en null-reference). </para>
<para>er noget anderledes end at følge en NULL-peger. Du fortalte slet ikke objektet hvad det er, og nu forsøger du at bruge det. Gætværket her er at du vil have en ny lokal instans af et Arts::Synth_PLAY-objekt. Du kan naturligvis have villet gøre noget andet (såsom at oprette objektet et andet sted, eller bruge et eksisterende fjernobjekt). Det er i alle tilfælde en bekvem genvej til at oprette objekter. At oprette et objekt når det først bruges virker ikke når du allerede har tildelt det til noget andet (som en null-reference). </para>
<para>Den tilsvarende C++ terminologi ville være <programlisting>
<para>Den tilsvarende C++ terminologi ville være <programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> som naturligvis helt enkelt giver en segmenteringsfejl i C++. Så dette er anderledes her. Denne måde at oprette objekt er tricket, eftersom det ikke er nødvendigt at der findes en implementering for din grænseflade. </para>
</programlisting> som naturligvis helt enkelt giver en segmenteringsfejl i C++. Så dette er anderledes her. Denne måde at oprette objekt er tricket, eftersom det ikke er nødvendigt at der findes en implementering for din grænseflade. </para>
<para>Der er ingen grund til at basere mellemprogrammer for multimedie på &Qt;. Ved at bestemme sig for det, og bruge alle de behagelige &Qt;-strømme og andre ting, kan det let føre til at mellemprogrammer kun bliver en sag for &Qt;-(eller i virkeligheden kun &kde;). Jeg mener at hvis jeg nogensinde ser at GNOME også bruger &DCOP;, eller noget lignende, er det naturligvis beviset for at jeg har taget fejl. </para>
<para>Der er ingen grund til at basere mellemprogrammer for multimedie på &Qt;. Ved at bestemme sig for det, og bruge alle de behagelige &Qt;-strømme og andre ting, kan det let føre til at mellemprogrammer kun bliver en sag for &Qt;-(eller i virkeligheden kun &kde;). Jeg mener at hvis jeg nogensinde ser at GNOME også bruger &DCOP;, eller noget lignende, er det naturligvis beviset for at jeg har taget fejl. </para>
<para>Selvom jeg ved at &DCOP; i grunden ikke kender til de datatyper som den sender, så man ville kunne bruge &DCOP; uden &Qt;, se hvordan den bruges i daglig &kde;-brug: man sender typer rundt såsom <classname>QString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, .... Disse bruger &Qt;'s-serialisering. Så hvis nogen vælger at understøtte &DCOP; i et GNOME-program, skal han enten angive at han bruger <classname>QString</classname>,... typer (selvom han ikke gør det), og emulere måden som &Qt; bruger til strømme, eller også skulle han sende andre streng-, pixmap- og rect-typer rundt, og på den måde alligevel ikke kunne virke sammen med &kde;-programmer. </para>
<para>Selvom jeg ved at &DCOP; i grunden ikke kender til de datatyper som den sender, så man ville kunne bruge &DCOP; uden &Qt;, se hvordan den bruges i daglig &kde;-brug: man sender typer rundt såsom <classname>TQString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, .... Disse bruger &Qt;'s-serialisering. Så hvis nogen vælger at understøtte &DCOP; i et GNOME-program, skal han enten angive at han bruger <classname>TQString</classname>,... typer (selvom han ikke gør det), og emulere måden som &Qt; bruger til strømme, eller også skulle han sende andre streng-, pixmap- og rect-typer rundt, og på den måde alligevel ikke kunne virke sammen med &kde;-programmer. </para>
<para>Nå, under alle omstændigheder var det altid meningen at &arts; var beregnet til at virke med eller uden &kde;, med eller uden &Qt;, med eller uden X11, og måske til og med med eller uden &Linux; (og jeg har ikke engang indvendinger mod personer som tilretter den til operativsystemer som ikke er frie). </para>
<para>Nå, under alle omstændigheder var det altid meningen at &arts; var beregnet til at virke med eller uden &kde;, med eller uden &Qt;, med eller uden X11, og måske til og med med eller uden &Linux; (og jeg har ikke engang indvendinger mod personer som tilretter den til operativsystemer som ikke er frie). </para>
@ -1923,7 +1923,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Angiver baggrundsfarve for at vise meddelelsen. Formatet på strengen kan være <quote>#RRGGBB</quote> (som returneres af <methodname>QColor::name()</methodname>), hvor RR, GG og BB er tocifrede hexadecimale værdier for rød, grøn og blå. Alternativt kan strengen være et af de andre formater som accepteres af <methodname>QColor::setNamedColor()</methodname>, såsom et navn fra X-farvedatabasen (f.eks. <quote>red</quote> eller <quote>steelblue</quote>). Angiv strengens værdi som nul for at vælge nuværende standardbaggrundsfarve.</para>
<para>Angiver baggrundsfarve for at vise meddelelsen. Formatet på strengen kan være <quote>#RRGGBB</quote> (som returneres af <methodname>TQColor::name()</methodname>), hvor RR, GG og BB er tocifrede hexadecimale værdier for rød, grøn og blå. Alternativt kan strengen være et af de andre formater som accepteres af <methodname>TQColor::setNamedColor()</methodname>, såsom et navn fra X-farvedatabasen (f.eks. <quote>red</quote> eller <quote>steelblue</quote>). Angiv strengens værdi som nul for at vælge nuværende standardbaggrundsfarve.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2025,21 +2025,21 @@ continuously in the background and alarms are always enabled.</para>
@ -2092,7 +2092,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Angiver baggrundsfarve for at vise filen. Formatet på strengen kan være <quote>#RRGGBB</quote> (som returneres af <methodname>QColor::name()</methodname>), hvor RR, GG og BB er tocifrede hexadecimale værdier for rød, grøn og blå. Alternativt kan strengen være et af de andre formater som accepteres af <methodname>QColor::setNamedColor()</methodname>, såsom et navn fra X-farvedatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Angiv strengens værdi som nul for at vælge nuværende standardbaggrundsfarve.</para>
<para>Angiver baggrundsfarve for at vise filen. Formatet på strengen kan være <quote>#RRGGBB</quote> (som returneres af <methodname>TQColor::name()</methodname>), hvor RR, GG og BB er tocifrede hexadecimale værdier for rød, grøn og blå. Alternativt kan strengen være et af de andre formater som accepteres af <methodname>TQColor::setNamedColor()</methodname>, såsom et navn fra X-farvedatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Angiv strengens værdi som nul for at vælge nuværende standardbaggrundsfarve.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2178,29 +2178,29 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>skemalæg en ny alarm som kører en skalkommando.</refpurpose>
<refpurpose>skemalæg en ny alarm som kører en skalkommando.</refpurpose>
<para><function>hastodo(QString taskname)</function> er et &DCOP;-kald som leder efter en opgave med angivet navn. Hvis den findes, returneres iCalendar-brugerid som identifierer opgaven. Hvis den ikke findes, returneres en tom streng. </para>
<para><function>hastodo(TQString taskname)</function> er et &DCOP;-kald som leder efter en opgave med angivet navn. Hvis den findes, returneres iCalendar-brugerid som identifierer opgaven. Hvis den ikke findes, returneres en tom streng. </para>
<para>Filen som gennemsøges er iCalendar-filen som &karm; for øjeblikket har åben. Alle opgavetræer gennemsøges, ikke kun opgaver på øverste niveau. Hvis mere end en opgave har et matchende navn, returneres den første som findes.</para>
<para>Filen som gennemsøges er iCalendar-filen som &karm; for øjeblikket har åben. Alle opgavetræer gennemsøges, ikke kun opgaver på øverste niveau. Hvis mere end en opgave har et matchende navn, returneres den første som findes.</para>
<para><function>addtodo(QString todoname)</function> er en &DCOP;-funktion som tilføjer en ny opgave på øverste niveau i nuværende lagringsobjekt. Den nye opgaves brugerid returneres. </para>
<para><function>addtodo(TQString todoname)</function> er en &DCOP;-funktion som tilføjer en ny opgave på øverste niveau i nuværende lagringsobjekt. Den nye opgaves brugerid returneres. </para>
<para>Det andet objekt i vort program er trykknappen, en instans af klassen <classname>QPushButton</classname>. Af de to konstruktorer der er til at oprette klassen, bruger vi den anden. Den tager en tekst, som er tekstindholdet i knappen. Her er det strengen "Hello world!". Derefter kalder vi metoden <methodname>resize()</methodname> for at ændre størrelse på knappen ifølge dens indhold. Knappen skal være større for at gøre strengen fuldstændigt synlig. </para>
<para>Det andet objekt i vort program er trykknappen, en instans af klassen <classname>QPushButton</classname>. Af de to konstruktorer der er til at oprette klassen, bruger vi den anden. Den tager en tekst, som er tekstindholdet i knappen. Her er det strengen "Hello world!". Derefter kalder vi metoden <methodname>resize()</methodname> for at ændre størrelse på knappen ifølge dens indhold. Knappen skal være større for at gøre strengen fuldstændigt synlig. </para>
<para>Men hvad gælder for metoden <methodname>show()</methodname>? Nu mærker du, at som de fleste andre grafiske komponenter, er <classname>QPushButton</classname> baseret på enkelt arv. Dokumentationen siger, Arver <classname>QButton</classname>. Følg linket til klassen <classname>QButton</classname>. Det viser mange andre kontroller som arves af <classname>QPushButton</classname>, som vi senere bruger til at forklare signal/slot-mekanismen. Under alle omstændigheder er metoden <methodname>show()</methodname> ikke på listen, og derfor skal den være en metode som også sørges for via arv. Klassen som <classname>QButton</classname> arver er <classname>QWidget</classname>. Følg kun linket igen, så ser du en hel mængde metoder som klassen QWidget sørger for, inklusive metoden <methodname>show()</methodname>. Nu forstår vi hvad der blev gjort i eksemplet med knappen: <orderedlist>
<para>Men hvad gælder for metoden <methodname>show()</methodname>? Nu mærker du, at som de fleste andre grafiske komponenter, er <classname>QPushButton</classname> baseret på enkelt arv. Dokumentationen siger, Arver <classname>QButton</classname>. Følg linket til klassen <classname>QButton</classname>. Det viser mange andre kontroller som arves af <classname>QPushButton</classname>, som vi senere bruger til at forklare signal/slot-mekanismen. Under alle omstændigheder er metoden <methodname>show()</methodname> ikke på listen, og derfor skal den være en metode som også sørges for via arv. Klassen som <classname>QButton</classname> arver er <classname>TQWidget</classname>. Følg kun linket igen, så ser du en hel mængde metoder som klassen TQWidget sørger for, inklusive metoden <methodname>show()</methodname>. Nu forstår vi hvad der blev gjort i eksemplet med knappen: <orderedlist>
<listitem><para>Lav en instans af <classname>QPushButton</classname>, og brug den anden konstruktor til at angive knappens tekst</para></listitem>
<listitem><para>Lav en instans af <classname>QPushButton</classname>, og brug den anden konstruktor til at angive knappens tekst</para></listitem>
<listitem><para>Ændr størrelsen på kontrollen til dens indhold</para></listitem>
<listitem><para>Ændr størrelsen på kontrollen til dens indhold</para></listitem>
<listitem><para>Sæt kontrollen som hovedkontrol instansen af <classname>QApplication</classname></para></listitem>
<listitem><para>Sæt kontrollen som hovedkontrol instansen af <classname>QApplication</classname></para></listitem>
<listitem><para>Fortæl den grafiske kontrol at den skal vises på skærmen ved at kalde <methodname>show()</methodname>, en metode som blev arvet fra <classname>QWidget</classname></para></listitem>
<listitem><para>Fortæl den grafiske kontrol at den skal vises på skærmen ved at kalde <methodname>show()</methodname>, en metode som blev arvet fra <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Efter at have kaldet metoden <methodname>exec()</methodname>, er programmet synligt for brugeren, og viser et vindue med knappen "Hello world!". Bemærk at programmer med grafiske grænseflader opfører sig noget anderledes sammenlignet med procedurebaserede program. Det vigtigste er at programmet går ind i en såkaldt "hovedbegivenhedsløkke". Det betyder at programmet skal vente på brugerens handlinger og derefter reagere på dem. Det betyder også, for et QT-program, at programmet skal være i hovedbegivenhedsløkken for at starte begivenhedshåndteringen. Næste afsnit beskriver kortfattet hvad det betyder for programmøren og hvad QT tilbyder for at håndtere begivenheder. </para>
<para>Efter at have kaldet metoden <methodname>exec()</methodname>, er programmet synligt for brugeren, og viser et vindue med knappen "Hello world!". Bemærk at programmer med grafiske grænseflader opfører sig noget anderledes sammenlignet med procedurebaserede program. Det vigtigste er at programmet går ind i en såkaldt "hovedbegivenhedsløkke". Det betyder at programmet skal vente på brugerens handlinger og derefter reagere på dem. Det betyder også, for et QT-program, at programmet skal være i hovedbegivenhedsløkken for at starte begivenhedshåndteringen. Næste afsnit beskriver kortfattet hvad det betyder for programmøren og hvad QT tilbyder for at håndtere begivenheder. </para>
<note><para>For brugere som allerede er avancerede: Knappen har ingen overliggende kontrol deklareret i konstruktoren. Derfor er den en topniveaukontrol og kører med en lokal begivenhedsløkke som ikke behøver at vente på hovedbegivenhedsløkken. Se dokumentationen for klassen QWidget og KDE's biblioteksreferenceguide.</para>
<note><para>For brugere som allerede er avancerede: Knappen har ingen overliggende kontrol deklareret i konstruktoren. Derfor er den en topniveaukontrol og kører med en lokal begivenhedsløkke som ikke behøver at vente på hovedbegivenhedsløkken. Se dokumentationen for klassen TQWidget og KDE's biblioteksreferenceguide.</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Nu fortsætter vi med at give programmet "liv" ved at behandle brugerbegivenheder. I almindelighed har brugeren to måder at kommunikere med et program: musen og tastaturet. En grafisk brugergrænseflade skal sørge for metoder for begge måder, som detekterer handlinger og gør noget som reaktion på handlingerne. </para>
<para>Nu fortsætter vi med at give programmet "liv" ved at behandle brugerbegivenheder. I almindelighed har brugeren to måder at kommunikere med et program: musen og tastaturet. En grafisk brugergrænseflade skal sørge for metoder for begge måder, som detekterer handlinger og gør noget som reaktion på handlingerne. </para>
<para>Vinduesystemet sender derfor alle kommunikationsbegivenheder til det tilsvarende program. <classname>QApplication</classname> sender dem derefter til det aktive vindue som en <classname>QEvent</classname>, og kontrollerne selv skal bestemme hvad som skal udføres med dem. En kontrol tager imod begivenheden og behandler <methodname>QWidget::event(QEvent*)</methodname>, som afgør hvilken begivenhed der er sket og hvordan reaktionen skal være. Metoden <methodname>event()</methodname> udfører derfor håndteringen af hovedbegivenheden. Derefter sender metoden <methodname>event()</methodname> begivenheden til et såkaldt begivenhedfilter som afgør hvad der sker og hvad der skal udføres med begivenheden. Hvis intet filter signalerer at det er ansvarligt for begivenheden, kaldes speciel begivenhedshåndtering. På den måde kan vi skelne mellem: <itemizedlist>
<para>Vinduesystemet sender derfor alle kommunikationsbegivenheder til det tilsvarende program. <classname>QApplication</classname> sender dem derefter til det aktive vindue som en <classname>QEvent</classname>, og kontrollerne selv skal bestemme hvad som skal udføres med dem. En kontrol tager imod begivenheden og behandler <methodname>TQWidget::event(QEvent*)</methodname>, som afgør hvilken begivenhed der er sket og hvordan reaktionen skal være. Metoden <methodname>event()</methodname> udfører derfor håndteringen af hovedbegivenheden. Derefter sender metoden <methodname>event()</methodname> begivenheden til et såkaldt begivenhedfilter som afgør hvad der sker og hvad der skal udføres med begivenheden. Hvis intet filter signalerer at det er ansvarligt for begivenheden, kaldes speciel begivenhedshåndtering. På den måde kan vi skelne mellem: <itemizedlist>
<listitem><para>Tastaturbegivenheder: Tabulator og Shift+Tabulator:</para>
<listitem><para>Tastaturbegivenheder: Tabulator og Shift+Tabulator:</para>
<para>Bemærk at alle begivenhedsfunktioner er virtuelle og protected. Derfor kan du implementere begivenhederne som du behøver i egne kontroller og angive hvordan din kontrol skal reagere. <classname>QWidget</classname> indeholder også nogle andre virtuelle metoder som kan være nyttige i dine programmer. Under alle omstændigheder er det nødvendigt at kende <classname>QWidget</classname> godt. </para>
<para>Bemærk at alle begivenhedsfunktioner er virtuelle og protected. Derfor kan du implementere begivenhederne som du behøver i egne kontroller og angive hvordan din kontrol skal reagere. <classname>TQWidget</classname> indeholder også nogle andre virtuelle metoder som kan være nyttige i dine programmer. Under alle omstændigheder er det nødvendigt at kende <classname>TQWidget</classname> godt. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Interaktion mellem objekt med signaler og slots</title>
<title>Interaktion mellem objekt med signaler og slots</title>
<para>Nu kommer vi til den mest åbenbare fordel ved QT-værktøjskassen: signal/slot-mekanismen. Den tilbyder en meget bekvem og nyttig løsning for kommunikation mellem objekter, som sædvanligvis løses med tilbagekaldsfunktioner i X-windows værktøjskasser. Eftersom kommunikationen kræver strikt programmering og ind imellem gør det meget svært at oprette brugergrænseflader (som beskrevet i QT-dokumentationen og forklaret i Programming with Qt af K. Dalheimer), opfandt TrollTech et nyt system hvor objekter kan sende signaler som kan forbindes til metoder som deklareres som slots. Som programmør af C++, behøver man kun at vide nogen ting om denne mekanisme: <itemizedlist>
<para>Nu kommer vi til den mest åbenbare fordel ved QT-værktøjskassen: signal/slot-mekanismen. Den tilbyder en meget bekvem og nyttig løsning for kommunikation mellem objekter, som sædvanligvis løses med tilbagekaldsfunktioner i X-windows værktøjskasser. Eftersom kommunikationen kræver strikt programmering og ind imellem gør det meget svært at oprette brugergrænseflader (som beskrevet i QT-dokumentationen og forklaret i Programming with Qt af K. Dalheimer), opfandt TrollTech et nyt system hvor objekter kan sende signaler som kan forbindes til metoder som deklareres som slots. Som programmør af C++, behøver man kun at vide nogen ting om denne mekanisme: <itemizedlist>
<listitem><para>klassedeklarationen af en klasse som bruger signaler og slots skal indeholde makroen TQ_OBJECT i begyndelsen (uden et semikolon), og skal afledes fra klassen <classname>QObject</classname> </para></listitem>
<listitem><para>klassedeklarationen af en klasse som bruger signaler og slots skal indeholde makroen TQ_OBJECT i begyndelsen (uden et semikolon), og skal afledes fra klassen <classname>TQObject</classname> </para></listitem>
<listitem><para>et signal kan sendes med nøgleordet emit, f.eks. emit signal(parametre);, inde i en hvilken som helst medlemsfunktion i en klasse som tillader brug af signaler og slots </para></listitem>
<listitem><para>et signal kan sendes med nøgleordet emit, f.eks. emit signal(parametre);, inde i en hvilken som helst medlemsfunktion i en klasse som tillader brug af signaler og slots </para></listitem>
<listitem><para>alle signaler som bruges af klasser som ikke arves skal tilføjes i klassedeklarationen i en signalsektion </para></listitem>
<listitem><para>alle signaler som bruges af klasser som ikke arves skal tilføjes i klassedeklarationen i en signalsektion </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>metaobjektoversætteren moc skal køres over deklarationsfilen for at ekspandere makroer og oprette implementeringen (som man ikke behøver kende til). Uddatafilerne fra moc kompileres også af C++ oversætteren. </para></listitem>
<listitem><para>metaobjektoversætteren moc skal køres over deklarationsfilen for at ekspandere makroer og oprette implementeringen (som man ikke behøver kende til). Uddatafilerne fra moc kompileres også af C++ oversætteren. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>En anden måde at bruge signaler uden at aflede fra <classname>QObject</classname> er at bruge klassen <classname>QSignal</classname>. Se referencedokumentationen for mere information og eksempel på brug. Vi antager at du afleder fra <classname>QObject</classname> i det følgende. </para>
<para>En anden måde at bruge signaler uden at aflede fra <classname>TQObject</classname> er at bruge klassen <classname>QSignal</classname>. Se referencedokumentationen for mere information og eksempel på brug. Vi antager at du afleder fra <classname>TQObject</classname> i det følgende. </para>
<para>På denne måde kan din klasse sende signaler hvor som helst og sørge for slots som signaler kan forbindes til. Ved at bruge et signal, behøver du ikke bryde dig om hvem der modtager det. Du behøver kun at sende signalet, og hvilken slot du end forbinder den til kan reagere når den sendes. Desuden kan en slot bruges som en almindelig metode i implementeringen. </para>
<para>På denne måde kan din klasse sende signaler hvor som helst og sørge for slots som signaler kan forbindes til. Ved at bruge et signal, behøver du ikke bryde dig om hvem der modtager det. Du behøver kun at sende signalet, og hvilken slot du end forbinder den til kan reagere når den sendes. Desuden kan en slot bruges som en almindelig metode i implementeringen. </para>
<para>For nu at forbinde et signal til en slot, skal du bruge metoderne <methodname>connect()</methodname> som varetages af <classname>QObject</classname> eller, hvis tilgængelige, specielle metoder som objekter sørger for for at angive forbindelsen for et vist signal. </para>
<para>For nu at forbinde et signal til en slot, skal du bruge metoderne <methodname>connect()</methodname> som varetages af <classname>TQObject</classname> eller, hvis tilgængelige, specielle metoder som objekter sørger for for at angive forbindelsen for et vist signal. </para>
<para>Du mærker at alt du skal tilføje for at give knappen mere kommunikation er metoden <methodname>connect()</methodname>: <methodname>connect (&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>;. Hvad er betydningen nu? Klassedeklarationen af QObject siger følgende om metoden <methodname>connect()</methodname>: </para>
<para>Du mærker at alt du skal tilføje for at give knappen mere kommunikation er metoden <methodname>connect()</methodname>: <methodname>connect (&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>;. Hvad er betydningen nu? Klassedeklarationen af TQObject siger følgende om metoden <methodname>connect()</methodname>: </para>
<para>Dette betyder at du skal angive en <classname>QObject</classname>-instanspeger som er signalets afsender, hvilket betyder at den kan sende signalet, som første parameter. Derefter skal du angive signalet som du vil forbinde til. De to sidste parametre er modtagerobjektet som sørger for en slot, fulgt af medlemsfunktionen som er en virkelig slot som vil køres når signalet sendes. </para>
<para>Dette betyder at du skal angive en <classname>TQObject</classname>-instanspeger som er signalets afsender, hvilket betyder at den kan sende signalet, som første parameter. Derefter skal du angive signalet som du vil forbinde til. De to sidste parametre er modtagerobjektet som sørger for en slot, fulgt af medlemsfunktionen som er en virkelig slot som vil køres når signalet sendes. </para>
<para>Ved at bruge signaler og slots, kan programmets objekter nemt kommunikere med hinanden uden udtrykkeligt at afhænge af typen af modtagarobjektet. Du vil lære mere om hvordan denne mekanisme bruges produktivt senere i håndbogen. Mere information om signal/slot-mekanismen findes også i <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE's biblioteksreferenceguide</ulink> og <ulink url="doc.trolltech.com">QT's reference på nettet</ulink>. </para>
<para>Ved at bruge signaler og slots, kan programmets objekter nemt kommunikere med hinanden uden udtrykkeligt at afhænge af typen af modtagarobjektet. Du vil lære mere om hvordan denne mekanisme bruges produktivt senere i håndbogen. Mere information om signal/slot-mekanismen findes også i <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE's biblioteksreferenceguide</ulink> og <ulink url="doc.trolltech.com">QT's reference på nettet</ulink>. </para>
<para>Du ser at vi først har ændret fra <classname>QApplication</classname> til <classname>TDEApplication</classname>. Desuden var vi tvunget til at ændre den tidligere brugte metode <methodname>setMainWidget()</methodname> til <methodname>setTopWidget</methodname> som <classname>TDEApplication</classname> bruger til for at angive hovedkontrollen. Det er alt! Dit første KDE-program er klart. Du behøver kun at fortælle oversætteren hvilken deklarationssøgesti KDE har, og linkeren at den skal linke med tdecore-biblioteket med -ltdecore. </para>
<para>Du ser at vi først har ændret fra <classname>QApplication</classname> til <classname>TDEApplication</classname>. Desuden var vi tvunget til at ændre den tidligere brugte metode <methodname>setMainWidget()</methodname> til <methodname>setTopWidget</methodname> som <classname>TDEApplication</classname> bruger til for at angive hovedkontrollen. Det er alt! Dit første KDE-program er klart. Du behøver kun at fortælle oversætteren hvilken deklarationssøgesti KDE har, og linkeren at den skal linke med tdecore-biblioteket med -ltdecore. </para>
<para>Eftersom du nu i det mindste ved hvad funktionen <function>main()</function> i almindelighed sørger for, og hvordan et program bliver synligt og tillader kommunikation mellem brugere og objekt, fortsætter vi med næste kapitel, hvor vort første program med &tdevelop; laves. Der kan du også prøve alt som tidligere blev nævnt, og se effekterne. </para>
<para>Eftersom du nu i det mindste ved hvad funktionen <function>main()</function> i almindelighed sørger for, og hvordan et program bliver synligt og tillader kommunikation mellem brugere og objekt, fortsætter vi med næste kapitel, hvor vort første program med &tdevelop; laves. Der kan du også prøve alt som tidligere blev nævnt, og se effekterne. </para>
<para>Hvad du yderligere bør have kigget på hidtil er QT-referencedokumentationen, især klasserne <classname>QApplication</classname>, <classname>QWidget</classname> og <classname>QObject</classname> og tdecore-biblioteksdokumentationen for klassen <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE's biblioteksreferenceguide</ulink> har også en fuldstændig beskrivelse af hvordan konstruktorerne i <classname>QApplication</classname> og <classname>TDEApplication</classname> kaldes, inklusive behandling af kommandolinjeflag. </para>
<para>Hvad du yderligere bør have kigget på hidtil er QT-referencedokumentationen, især klasserne <classname>QApplication</classname>, <classname>TQWidget</classname> og <classname>TQObject</classname> og tdecore-biblioteksdokumentationen for klassen <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE's biblioteksreferenceguide</ulink> har også en fuldstændig beskrivelse af hvordan konstruktorerne i <classname>QApplication</classname> og <classname>TDEApplication</classname> kaldes, inklusive behandling af kommandolinjeflag. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // tillad visningen at ændre statuslinjen og overskriften
18 // tillad visningen at ændre statuslinjen og overskriften
<para>Det behøves ikke at siges at stabilitet er et af hovedmålene med konstruktionen. Ingen kan forhindre fejl, men et minimum kan i det mindste opnås med smarte konstruktionsmål og udbredt brug af objektorienterede konstruktioner. C++ gør det til en fornøjelse at programmere hvis du ved hvordan man udnytter dens muligheder - arv, at skjule information og genbrug af eksisterende kode. </para>
<para>Det behøves ikke at siges at stabilitet er et af hovedmålene med konstruktionen. Ingen kan forhindre fejl, men et minimum kan i det mindste opnås med smarte konstruktionsmål og udbredt brug af objektorienterede konstruktioner. C++ gør det til en fornøjelse at programmere hvis du ved hvordan man udnytter dens muligheder - arv, at skjule information og genbrug af eksisterende kode. </para>
<para>Når et KDE- eller QT-projekt laves, skal du altid have en visning som arver en QWidget, enten med direkte arv eller fordi en bibliotekskontrol som du vil bruge arver QWidget. Derfor har Programguiden allerede oprettet en visning som er en instans af klassen programnavnView, som allerede arver QWidget. </para>
<para>Når et KDE- eller QT-projekt laves, skal du altid have en visning som arver en TQWidget, enten med direkte arv eller fordi en bibliotekskontrol som du vil bruge arver TQWidget. Derfor har Programguiden allerede oprettet en visning som er en instans af klassen programnavnView, som allerede arver TQWidget. </para>
<para>Dette kapitel beskriver derfor hvordan bibliotekskontroller bruges til at oprette visninger for KDE- og QT-programmer som laves med &tdevelop;. Derefter kigger vi på bibliotekerne og hvilke slags visninger de allerede tilbyder. </para>
<para>Dette kapitel beskriver derfor hvordan bibliotekskontroller bruges til at oprette visninger for KDE- og QT-programmer som laves med &tdevelop;. Derefter kigger vi på bibliotekerne og hvilke slags visninger de allerede tilbyder. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>Når du kigger på den første side af QT's net-dokumentation, finder du et link til "Widget Screenshots", hvor du kan kigge på hvordan de grafiske kontroller som QT indeholder ser ud. De er parate til at bruge, og kan kombineres til at give komplekse kontroller som kan oprette programvisninger eller dialoger. I det følgende beskriver vi nogle af disse, som er meget nyttigt til at oprette programvisninger, men husk at KDE-bibliotekerne sommetider indeholder andre kontroller med samme formål. Disse diskuteres i næste afsnit. </para>
<para>Når du kigger på den første side af QT's net-dokumentation, finder du et link til "Widget Screenshots", hvor du kan kigge på hvordan de grafiske kontroller som QT indeholder ser ud. De er parate til at bruge, og kan kombineres til at give komplekse kontroller som kan oprette programvisninger eller dialoger. I det følgende beskriver vi nogle af disse, som er meget nyttigt til at oprette programvisninger, men husk at KDE-bibliotekerne sommetider indeholder andre kontroller med samme formål. Disse diskuteres i næste afsnit. </para>
<para>Her er nogle vink om hvilken Qt-komponent der kan bruges til hvilket slutmål: <orderedlist>
<para>Her er nogle vink om hvilken Qt-komponent der kan bruges til hvilket slutmål: <orderedlist>
<listitem><para>Hvis visningsområdet ikke er stort nok til at vise alle data, skal brugeren kunne panorere i dokumentet med lister til venstre og længst nede i visningen. QT sørger for klassen <classname>QScrollView</classname> for dette, som tilbyder et underliggende område med panoreringsmulighed. Som tidligere forklaret, kan du lade dine egne grafiske kontroller arve <classname>QScrollView</classname>, eller bruge en instans for at håndtere dit dokuments visningskomponent. </para></listitem>
<listitem><para>Hvis visningsområdet ikke er stort nok til at vise alle data, skal brugeren kunne panorere i dokumentet med lister til venstre og længst nede i visningen. QT sørger for klassen <classname>QScrollView</classname> for dette, som tilbyder et underliggende område med panoreringsmulighed. Som tidligere forklaret, kan du lade dine egne grafiske kontroller arve <classname>QScrollView</classname>, eller bruge en instans for at håndtere dit dokuments visningskomponent. </para></listitem>
<listitem><para>For at oprette en egen ScrollView, lad komponenten View arve fra <classname>QWidget</classname> og tilføj lodrette og vandrette rullebjælker med <classname>QScrollBars</classname>. (Dette udføres af KDE's kontrol TDEHTMLView.) </para></listitem>
<listitem><para>For at oprette en egen ScrollView, lad komponenten View arve fra <classname>TQWidget</classname> og tilføj lodrette og vandrette rullebjælker med <classname>QScrollBars</classname>. (Dette udføres af KDE's kontrol TDEHTMLView.) </para></listitem>
<listitem><para>Til tekstbehandling, bruges <classname>QTextEdit</classname>. Denne klasse sørger for en fuldstændig grafisk teksteditorkontrol, som allerede kan klippe, kopiere og indsætte tekst og håndteres af en visning med rullebjælker. </para></listitem>
<listitem><para>Til tekstbehandling, bruges <classname>QTextEdit</classname>. Denne klasse sørger for en fuldstændig grafisk teksteditorkontrol, som allerede kan klippe, kopiere og indsætte tekst og håndteres af en visning med rullebjælker. </para></listitem>
<listitem><para>Brug <classname>QTable</classname> til at vise data som er arrangeret i en tabel. Eftersom <classname>QTable</classname> også håndteres af rullebjælker, tilbyder den en god løsning for programmer med tabelberegninger. </para></listitem>
<listitem><para>Brug <classname>QTable</classname> til at vise data som er arrangeret i en tabel. Eftersom <classname>QTable</classname> også håndteres af rullebjælker, tilbyder den en god løsning for programmer med tabelberegninger. </para></listitem>
<listitem><para>For at vise to forskellige grafiske kontroller eller to instanser af samme kontrol samtidigt, bruges <classname>QSplitter</classname>. Den tillader at visninger lægges side ved side med vandrette eller lodrette opdelere. Kmail er et godt eksempel på hvordan det ser ud. Hovedvinduet er opdelt lodret af en opdeler, og det højre vindue er igen opdelt vandret. </para></listitem>
<listitem><para>For at vise to forskellige grafiske kontroller eller to instanser af samme kontrol samtidigt, bruges <classname>QSplitter</classname>. Den tillader at visninger lægges side ved side med vandrette eller lodrette opdelere. Kmail er et godt eksempel på hvordan det ser ud. Hovedvinduet er opdelt lodret af en opdeler, og det højre vindue er igen opdelt vandret. </para></listitem>
@ -653,7 +653,7 @@ return a.exec();
<title>Indstilling af genvejstaster</title>
<title>Indstilling af genvejstaster</title>
<para>Noget meget professionelt som du altid bør tilføje i programmet er genvejstaster. De bruges oftest af erfarne brugere som vil arbejde hurtigt med deres programmer og er villige til at lære sig genveje. KDE-bibliotekerne tilbyder klassen <classname>TDEAction</classname> til dette, som sørger for genvejstaster og adgang til globalt indstillede standardgenveje. </para>
<para>Noget meget professionelt som du altid bør tilføje i programmet er genvejstaster. De bruges oftest af erfarne brugere som vil arbejde hurtigt med deres programmer og er villige til at lære sig genveje. KDE-bibliotekerne tilbyder klassen <classname>TDEAction</classname> til dette, som sørger for genvejstaster og adgang til globalt indstillede standardgenveje. </para>
<para>Normalt bruger kun rammeprogrammer oprettet af &tdevelop; almindelige genvejstaster såsom F1 for at komme til nethjælp, Ctrl+N for Ny fil, osv. </para>
<para>Normalt bruger kun rammeprogrammer oprettet af &tdevelop; almindelige genvejstaster såsom F1 for at komme til nethjælp, Ctrl+N for Ny fil, osv. </para>
<para>Hvis programmet indeholder mange genvejstaster bør du gøre dem indstillelige via en indstillingsmenu. Enten kan det kombineres med anden programindstilling i en QWidget eller være alene. KDE-biblioteket sørger allerede for en <classname>KKeyChooser</classname> til at bruge i fanebladsdialoger, mens <classname>KKeyDialog</classname> sørger for en indstillingsdialog for genvejstaster som er parat til brug. </para>
<para>Hvis programmet indeholder mange genvejstaster bør du gøre dem indstillelige via en indstillingsmenu. Enten kan det kombineres med anden programindstilling i en TQWidget eller være alene. KDE-biblioteket sørger allerede for en <classname>KKeyChooser</classname> til at bruge i fanebladsdialoger, mens <classname>KKeyDialog</classname> sørger for en indstillingsdialog for genvejstaster som er parat til brug. </para>
</sect1>
</sect1>
</chapter>
</chapter>
@ -696,7 +696,7 @@ return a.exec();
<sect1 id="c8s4">
<sect1 id="c8s4">
<title>Knappen <guibutton>Hvad er dette?</guibutton></title>
<title>Knappen <guibutton>Hvad er dette?</guibutton></title>
<para>Knappen <guibutton>Hvad er dette...?</guibutton> sørger for hjælpevinduer med formålet at give brugeren hjælp med en vis kontrol i visningen som bruges eller et objekt i en værktøjslinje. Den er i værktøjslinjen og aktiveres når brugeren trykker på knappen. Markøren ændres til en pilemarkør med et spørgsmålstegn, præcis som knappen selv ser ud. Derefter kan brugeren klikke på en synlig kontrol og får så et hjælpevindue. Som en øvelse kan du prøve opførslen med knappen <guibutton>Hvad er dette...?</guibutton> inde i &tdevelop;. </para>
<para>Knappen <guibutton>Hvad er dette...?</guibutton> sørger for hjælpevinduer med formålet at give brugeren hjælp med en vis kontrol i visningen som bruges eller et objekt i en værktøjslinje. Den er i værktøjslinjen og aktiveres når brugeren trykker på knappen. Markøren ændres til en pilemarkør med et spørgsmålstegn, præcis som knappen selv ser ud. Derefter kan brugeren klikke på en synlig kontrol og får så et hjælpevindue. Som en øvelse kan du prøve opførslen med knappen <guibutton>Hvad er dette...?</guibutton> inde i &tdevelop;. </para>
<para>For at tilføje "Hvad er dette...?" hjælp til en af dine grafiske kontroller, bruges den statiske metode <methodname>QWhatsThis::add(QWidget *widget, const QString &text)</methodname> </para>
<para>For at tilføje "Hvad er dette...?" hjælp til en af dine grafiske kontroller, bruges den statiske metode <methodname>QWhatsThis::add(TQWidget *widget, const TQString &text)</methodname> </para>
<para>Qt's lavniveau tegnemodel er baseret på de muligheder som tilbydes af X11 og andre vinduessystemer hvor en version af Qt findes. Men den udvider dem også ved at implementere yderligere funktioner såsom vilkårlige affine transformationer for tekst og billeder. </para>
<para>Qt's lavniveau tegnemodel er baseret på de muligheder som tilbydes af X11 og andre vinduessystemer hvor en version af Qt findes. Men den udvider dem også ved at implementere yderligere funktioner såsom vilkårlige affine transformationer for tekst og billeder. </para>
<para>Den centrale grafiske klasse til at tegne todimensionalt med Qt er <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Den kan tegne på en <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Der er tre mulige tegneenheder implementerede: En er <ulink url="kdeapi:qt/QWidget">QWidget</ulink>, som repræsenterer en grafisk kontrol på skærmen. Den anden er <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, som repræsenterer en printer, og producerer Postscript-udskrift. Den tredje er klassen <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, som indspiller tegnekommandoer og kan gemme dem til disk, og derefter afspille dem. Et muligt lagringsformat for tegnekommandoer er W3C-standarden SVG. </para>
<para>Den centrale grafiske klasse til at tegne todimensionalt med Qt er <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Den kan tegne på en <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Der er tre mulige tegneenheder implementerede: En er <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink>, som repræsenterer en grafisk kontrol på skærmen. Den anden er <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, som repræsenterer en printer, og producerer Postscript-udskrift. Den tredje er klassen <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, som indspiller tegnekommandoer og kan gemme dem til disk, og derefter afspille dem. Et muligt lagringsformat for tegnekommandoer er W3C-standarden SVG. </para>
<para>Altså er det muligt at genbruge visningskoden som du bruger til for at vise en grafisk kontrol for udskrift, med støtte for samme funktioner. Naturligvis bruges koden i praksis i en noget anderledes sammenhæng. Tegning på en grafisk kontrol gøres næsten kun i metoden paintEvent() i en kontrolklasse. </para>
<para>Altså er det muligt at genbruge visningskoden som du bruger til for at vise en grafisk kontrol for udskrift, med støtte for samme funktioner. Naturligvis bruges koden i praksis i en noget anderledes sammenhæng. Tegning på en grafisk kontrol gøres næsten kun i metoden paintEvent() i en kontrolklasse. </para>
<para>Farver har betydning både når kurvor tegnes, og når former udfyldes. Farver repræsenteres af klassen <ulink url="kdeapi:qt/QColor">QColor</ulink> i Qt. Qt understøtter ikke avancerede grafikfunktioner såsom ICC-farveprofiler og farvekorrektion. Farver laves oftest ved at angive deres røde, grønne og blå komponenter, eftersom RGB-modellen er måden som billedpunkter sammensættes en billedskærm. </para>
<para>Farver har betydning både når kurvor tegnes, og når former udfyldes. Farver repræsenteres af klassen <ulink url="kdeapi:qt/TQColor">TQColor</ulink> i Qt. Qt understøtter ikke avancerede grafikfunktioner såsom ICC-farveprofiler og farvekorrektion. Farver laves oftest ved at angive deres røde, grønne og blå komponenter, eftersom RGB-modellen er måden som billedpunkter sammensættes en billedskærm. </para>
<para>Det er også muligt at bruge farvetone, mætning og værdi. Denne HSV-repræsentation er den som bruges i GTK's farvedialog, f.eks. i GIMP. Der svarer farvetonen til en vinkel i farvehjulet, mens farvemætningen svarer til afstanden fra cirklens midte. Værdien vælges med en separat glider. </para>
<para>Det er også muligt at bruge farvetone, mætning og værdi. Denne HSV-repræsentation er den som bruges i GTK's farvedialog, f.eks. i GIMP. Der svarer farvetonen til en vinkel i farvehjulet, mens farvemætningen svarer til afstanden fra cirklens midte. Værdien vælges med en separat glider. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> svarer direkte til pixmapsobjekter i X11. En pixmap er et objekt på serversiden og kan, med et moderne grafikkort, til og med opbevares direkte i kortets hukommelse. Det gør det <emphasis>meget</emphasis> effektivt at overføre en pixmap til skærmen. En pixmap virker også som en svarende til grafiske kontroller udenfor skærmen. QPixmap-klassen er en delklasse til QPaintDevice, så det er muligt at tegne på den med en QPainter. Elementære tegneoperationer accelereres ofte af moderne grafik. Derfor er et almindeligt brugsmønster at bruge en pixmap til dobbeltbuffering. Dette betyder at i stedet for at tegne direkte på en grafisk kontrol, tegner man på et tilfældigt pixmapobjekt og bruger funktionen <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> til at overføre det til kontrollen. For komplekse gentegninger, hjælper dette med at undgå flimmer. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> svarer direkte til pixmapsobjekter i X11. En pixmap er et objekt på serversiden og kan, med et moderne grafikkort, til og med opbevares direkte i kortets hukommelse. Det gør det <emphasis>meget</emphasis> effektivt at overføre en pixmap til skærmen. En pixmap virker også som en svarende til grafiske kontroller udenfor skærmen. QPixmap-klassen er en delklasse til QPaintDevice, så det er muligt at tegne på den med en QPainter. Elementære tegneoperationer accelereres ofte af moderne grafik. Derfor er et almindeligt brugsmønster at bruge en pixmap til dobbeltbuffering. Dette betyder at i stedet for at tegne direkte på en grafisk kontrol, tegner man på et tilfældigt pixmapobjekt og bruger funktionen <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> til at overføre det til kontrollen. For komplekse gentegninger, hjælper dette med at undgå flimmer. </para>
<para>I modsætning til dette, er der <ulink url="kdeapi:qt/QImage">QImage</ulink>-objekter på klientsiden. Deres hovedopgave er at give direkte adgang til billedpunkterne i billederne. Det gør dem nyttige til billedhåndtering, og ting såsom at indlæse og gemme til disk (Metoden load() for QPixmap bruger QImage som et mellemtrin). På den anden siden, så bliver optegning af et billede på en grafisk kontrol en ganske krævende handling, eftersom det indebærer en overførsel til X-serveren, hvilket kan tage en vis tid, især for store billeder og fjernservere. Afhængig af farvedybden, kan konvertering fra QImage til QPixmap også kræve brug af dithering. </para>
<para>I modsætning til dette, er der <ulink url="kdeapi:qt/TQImage">TQImage</ulink>-objekter på klientsiden. Deres hovedopgave er at give direkte adgang til billedpunkterne i billederne. Det gør dem nyttige til billedhåndtering, og ting såsom at indlæse og gemme til disk (Metoden load() for QPixmap bruger TQImage som et mellemtrin). På den anden siden, så bliver optegning af et billede på en grafisk kontrol en ganske krævende handling, eftersom det indebærer en overførsel til X-serveren, hvilket kan tage en vis tid, især for store billeder og fjernservere. Afhængig af farvedybden, kan konvertering fra TQImage til QPixmap også kræve brug af dithering. </para>
<para>Tekst kan tegnes med en af de overbelastede varianter af metoden QPainter::drawText(). Disse tegner en QString, enten ved et given punkt eller inde i en given rektangel, med skrifttypen som indstilles med QPainter::setFont(). Der er også en parameter som tager en ELLER-kombination af visse flag fra nummereringstyperne <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> og <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink>. </para>
<para>Tekst kan tegnes med en af de overbelastede varianter af metoden QPainter::drawText(). Disse tegner en TQString, enten ved et given punkt eller inde i en given rektangel, med skrifttypen som indstilles med QPainter::setFont(). Der er også en parameter som tager en ELLER-kombination af visse flag fra nummereringstyperne <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> og <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink>. </para>
<para>Begyndende i version 3.0, håndterer Qt fuldstændig tekstlayout også for sprog som skrives fra højre til venstre. </para>
<para>Begyndende i version 3.0, håndterer Qt fuldstændig tekstlayout også for sprog som skrives fra højre til venstre. </para>
<para>Foruden de sædvanlige indgange, demonstrerer dette eksempel hvordan man angiver at en tjeneste har visse egenskaber. Hver definition af en egenskab svarer til en gruppe <literal>[PropertyDef::name]</literal> i konfigurationsfilen. I gruppen, angiver indgangen <literal>Type</literal> egenskabens type. Mulige typer er alt som kan opbevares i en <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Foruden de sædvanlige indgange, demonstrerer dette eksempel hvordan man angiver at en tjeneste har visse egenskaber. Hver definition af en egenskab svarer til en gruppe <literal>[PropertyDef::name]</literal> i konfigurationsfilen. I gruppen, angiver indgangen <literal>Type</literal> egenskabens type. Mulige typer er alt som kan opbevares i en <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Med objektet <classname>KService</classname> tilgængeligt, kan du meget let indlæse biblioteket og få en peger til dets tilvirkningsobjekt. </para>
<para>Med objektet <classname>KService</classname> tilgængeligt, kan du meget let indlæse biblioteket og få en peger til dets tilvirkningsobjekt. </para>
if (!client->isApplicationRegistered("tdeio_uiserver")) {
if (!client->isApplicationRegistered("tdeio_uiserver")) {
QString error;
TQString error;
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
cout << "Start af TDEIO-server mislykkedes med meddelelsen " << error << endl;
cout << "Start af TDEIO-server mislykkedes med meddelelsen " << error << endl;
}
}
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>I eksemplet som gives her, startes tjenesten "med navn", dvs. første argument til <function>TDEApplication::startServiceByName() </function> er navnet, som det angives på linjen <literal>Name</literal> i desktop-filen. Et alternativ er at bruge <function>TDEApplication::startServiceByDesktopName()</function>, som bruger navnet på desktop-filen som argument, dvs. i dette tilfælde <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>I eksemplet som gives her, startes tjenesten "med navn", dvs. første argument til <function>TDEApplication::startServiceByName() </function> er navnet, som det angives på linjen <literal>Name</literal> i desktop-filen. Et alternativ er at bruge <function>TDEApplication::startServiceByDesktopName()</function>, som bruger navnet på desktop-filen som argument, dvs. i dette tilfælde <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Alle disse kald har en liste med URL'er som andet argument, som gives til tjenesten på kommandolinjen. Det tredje argument er en peger til en <classname>QString</classname>. Hvis starten af tjenesten mislykkes, tildeles dette argument til en oversat fejlmeddelelse. </para>
<para>Alle disse kald har en liste med URL'er som andet argument, som gives til tjenesten på kommandolinjen. Det tredje argument er en peger til en <classname>TQString</classname>. Hvis starten af tjenesten mislykkes, tildeles dette argument til en oversat fejlmeddelelse. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Naturligvis kan selv KMimeMagic kun afgøre filtypen ud fra indholdet i en lokal fil. For fjernfiler, er der yderligere en mulighed: </para>
<para>Naturligvis kan selv KMimeMagic kun afgøre filtypen ud fra indholdet i en lokal fil. For fjernfiler, er der yderligere en mulighed: </para>
<para>Dette antager at du er inde i en &kommander;-fil og har adgang til specialen @pid, som indeholder procesID'et. Faktisk er de lettere at erstatte <quote>kmdr-executor-@pid</quote> med @dcopid. Du kan dog bruge denne syntaks (naturligvis uden specialerne), fra kommandolinjen eller et hvilket som helst eksternt script, for at ændre &kommander;-vinduet. </para>
<para>Dette antager at du er inde i en &kommander;-fil og har adgang til specialen @pid, som indeholder procesID'et. Faktisk er de lettere at erstatte <quote>kmdr-executor-@pid</quote> med @dcopid. Du kan dog bruge denne syntaks (naturligvis uden specialerne), fra kommandolinjen eller et hvilket som helst eksternt script, for at ændre &kommander;-vinduet. </para>
<para>Fordi &kommander; ikke har en fuldstændig fortolker i sit alfastadium, hvis du vil bruge den meget hurtigere interne &DCOP; fra et andet applikationsvindue (konsol &DCOP; er meget langsomt) er det meget mere kompliceret fordi du skal give meget information, inklusive en prototype af kaldet. Det ovenstående kald ville blive til: </para>
<para>Fordi &kommander; ikke har en fuldstændig fortolker i sit alfastadium, hvis du vil bruge den meget hurtigere interne &DCOP; fra et andet applikationsvindue (konsol &DCOP; er meget langsomt) er det meget mere kompliceret fordi du skal give meget information, inklusive en prototype af kaldet. Det ovenstående kald ville blive til: </para>
<para>Da dette blev skrevet skulle man være klar over at indlejre &DCOP;-kald inde i scriptsprogstrukturer (som <application>bash</application> betyder at man skal bruge konsolmetodekald. <emphasis>Hvis du bruger interne &DCOP;-kld , vil alle &kommander;-specialer blive udført først og dernæst scriptet.</emphasis> </para>
<para>Da dette blev skrevet skulle man være klar over at indlejre &DCOP;-kald inde i scriptsprogstrukturer (som <application>bash</application> betyder at man skal bruge konsolmetodekald. <emphasis>Hvis du bruger interne &DCOP;-kld , vil alle &kommander;-specialer blive udført først og dernæst scriptet.</emphasis> </para>
<para>Der er en ny og simpel måde at bruge &DCOP; på, i &kommander; ved at bruge en objektsyntaks. Lad os sige at du vil ændre teksten i en kontrols navn @linjeEditor1. Det ville se således ud: </para>
<para>Der er en ny og simpel måde at bruge &DCOP; på, i &kommander; ved at bruge en objektsyntaks. Lad os sige at du vil ændre teksten i en kontrols navn @linjeEditor1. Det ville se således ud: </para>
<para>Returnerer værdien af den specficerede globale variabel. Når et script køres inde fra &kommander;-vinduet, vil alle (non-globale) variabler sat i dette script, holde op med at eksistere efter scriptet er kørt færdigt og vil derfor ikke være til rådighed for andre scriptprocesser eller i en ny instans af den kaldende proces. Det globale <quote>virkefelt</quote> betyder at variablen eksisterer for alle processer i vinduet indtil dette vindue lukkes. Du kan ændre disse variabler på et hvilket som helst tidspunk, med et nyt kald til <function>@setGlobal</function>. </para>
<para>Returnerer værdien af den specficerede globale variabel. Når et script køres inde fra &kommander;-vinduet, vil alle (non-globale) variabler sat i dette script, holde op med at eksistere efter scriptet er kørt færdigt og vil derfor ikke være til rådighed for andre scriptprocesser eller i en ny instans af den kaldende proces. Det globale <quote>virkefelt</quote> betyder at variablen eksisterer for alle processer i vinduet indtil dette vindue lukkes. Du kan ændre disse variabler på et hvilket som helst tidspunk, med et nyt kald til <function>@setGlobal</function>. </para>
<para>Opretter en variabel som er global for vinduesprocessen og tildeler værdien til den. Denne værdi kan hentes med global(QString variabelNavn) eller tildeles en ny værdi. </para>
<para>Opretter en variabel som er global for vinduesprocessen og tildeler værdien til den. Denne værdi kan hentes med global(TQString variabelNavn) eller tildeles en ny værdi. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString text)</term>
<term>changeWidgetText(TQString text)</term>
<listitem>
<listitem>
<para>Dette skal omdøbes til setWidgetText og dette navn bliver sikker overflødiggjort. Det fjerner teksten der vises i kontrollen og erstatter det med den givne tekst. </para>
<para>Dette skal omdøbes til setWidgetText og dette navn bliver sikker overflødiggjort. Det fjerner teksten der vises i kontrollen og erstatter det med den givne tekst. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString text)</term>
<term>setAssociatedText(TQString text)</term>
<listitem>
<listitem>
<para>Den sætter &kommander;s standard Text-streng. Den sættes typisk til <quote>@widgeText</quote> for at vise hvad der indtastes i kontrollen. Det er usandsynligt at du får behov for det, men hvis du gør er det her det foregår. Dette gælder for alle kontroller der kan indeholde data. </para>
<para>Den sætter &kommander;s standard Text-streng. Den sættes typisk til <quote>@widgeText</quote> for at vise hvad der indtastes i kontrollen. Det er usandsynligt at du får behov for det, men hvis du gør er det her det foregår. Dette gælder for alle kontroller der kan indeholde data. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>&DCOP; til listeboks- og kombinationsfelt-kontroller</title>
<title>&DCOP; til listeboks- og kombinationsfelt-kontroller</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString item, int index)</term>
<term>addListItem(TQString item, int index)</term>
<listitem>
<listitem>
<para>Tilføjer et element til en listebokskontrol ved det specificerede indeks. Listeindekset starter ved nul For at tilføje til slutinngen af en liste, bruges -1. </para>
<para>Tilføjer et element til en listebokskontrol ved det specificerede indeks. Listeindekset starter ved nul For at tilføje til slutinngen af en liste, bruges -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString item)</term>
<term>addUniqueItem(TQString item)</term>
<listitem>
<listitem>
<para>addUniqueItem tilføjer et element til slutningen af listen, men kun hvis det er unikt. </para>
<para>addUniqueItem tilføjer et element til slutningen af listen, men kun hvis det er unikt. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>&DCOP; for afkrydsningsfelt- og radioknapkontroller</title>
<title>&DCOP; for afkrydsningsfelt- og radioknapkontroller</title>
<listitem><para>Eine negative Vorwärtsreferenz verhindert, dass der Text zutrifft, wenn der nachfolgende Text auf das <emphasis>MUSTER</emphasis> zutrifft.</para>
<listitem><para>Eine negative Vorwärtsreferenz verhindert, dass der Text zutrifft, wenn der nachfolgende Text auf das <emphasis>MUSTER</emphasis> zutrifft.</para>
<para>Der Ausdruck <userinput>const \w+\b(?!\s*&)</userinput> trifft auf <quote>const char</quote> im Text <quote>const char* foo</quote>, aber nicht <quote>const QString</quote> in <quote>const QString& bar</quote> weil das <quote>&</quote> auf die negative Vorwärtsreferenz zutrifft.</para>
<para>Der Ausdruck <userinput>const \w+\b(?!\s*&)</userinput> trifft auf <quote>const char</quote> im Text <quote>const char* foo</quote>, aber nicht <quote>const TQString</quote> in <quote>const TQString& bar</quote> weil das <quote>&</quote> auf die negative Vorwärtsreferenz zutrifft.</para>
<listitem><para>Modul-Klassen müssen eine <literal>static</literal>-Funktion namens <function>names</function> enthalten, die eine Liste der Namen zurückgibt, mit denen sie aufgerufen werden kann.</para></listitem>
<listitem><para>Modul-Klassen müssen eine <literal>static</literal>-Funktion namens <function>names</function> enthalten, die eine Liste der Namen zurückgibt, mit denen sie aufgerufen werden kann.</para></listitem>
<listitem><para>Falls das Modul im Kontrollzentrum eingerichtet werden kann, muss es eine von <literal>ThemeEngineConfig</literal> abgeleitete Klasse zur Einrichtung enthalten.</para></listitem>
<listitem><para>Falls das Modul im Kontrollzentrum eingerichtet werden kann, muss es eine von <literal>ThemeEngineConfig</literal> abgeleitete Klasse zur Einrichtung enthalten.</para></listitem>
<listitem><para>Modul-Klassen müssen mindestens eine der virtuellen Funktionen <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> und <function>slotUpdatSteps</function> überschreiben.</para></listitem>
<listitem><para>Modul-Klassen müssen mindestens eine der virtuellen Funktionen <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> und <function>slotUpdatSteps</function> überschreiben.</para></listitem>
<listitem><para>Der Konstruktor sollte die Form <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args)</literal> haben, damit es mit <classname>KGenericFactory</classname> genutzt werden kann.</para></listitem>
<listitem><para>Der Konstruktor sollte die Form <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args)</literal> haben, damit es mit <classname>KGenericFactory</classname> genutzt werden kann.</para></listitem>
</orderedlist>
</orderedlist>
<para>Die letzte Anforderung scheint kompliziert zu sein, aber Sie werden später feststellen, dass dies durch nur eine einzige Zeile im Quelltext erledigt werden kann.</para>
<para>Die letzte Anforderung scheint kompliziert zu sein, aber Sie werden später feststellen, dass dies durch nur eine einzige Zeile im Quelltext erledigt werden kann.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Nun gut, gehen wir die obige Auflistung durch: Die Klasse <classname>Theme2k</classname> ist von <classname>ThemeEngine</classname> abgeleitet und erfüllt die Namenskonvention. Sie enthält die Funktion <methodname>Theme2k::names()</methodname> und hat einen Konstruktor mit den benötigten Parametern: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> und enthält eine einfache Methode <methodname>Theme2k::slotSetText()</methodname>. Kümmern Sie sich erstmal nicht um die Klasse <classname>RotWidget</classname>; sie erzeugt nur ein hübsches Bildschirmelement. Unser Modul ist sehr einfach gehalten und zeigt keine Symbole oder eine Fortschrittsanzeige an. Wenn Sie das möchten, überschreiben Sie die Funktion <function>slotSetPixmap</function>. Ähnliche Funktionen gibt es auch für die Schritte der Fortschrittsanzeige (<function>slotUpdateSteps</function>) und zum Inkrementieren (<function>slotUpdateProgress</function>) des aktuellen Schrittes. </para>
<para>Nun gut, gehen wir die obige Auflistung durch: Die Klasse <classname>Theme2k</classname> ist von <classname>ThemeEngine</classname> abgeleitet und erfüllt die Namenskonvention. Sie enthält die Funktion <methodname>Theme2k::names()</methodname> und hat einen Konstruktor mit den benötigten Parametern: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> und enthält eine einfache Methode <methodname>Theme2k::slotSetText()</methodname>. Kümmern Sie sich erstmal nicht um die Klasse <classname>RotWidget</classname>; sie erzeugt nur ein hübsches Bildschirmelement. Unser Modul ist sehr einfach gehalten und zeigt keine Symbole oder eine Fortschrittsanzeige an. Wenn Sie das möchten, überschreiben Sie die Funktion <function>slotSetPixmap</function>. Ähnliche Funktionen gibt es auch für die Schritte der Fortschrittsanzeige (<function>slotUpdateSteps</function>) und zum Inkrementieren (<function>slotUpdateProgress</function>) des aktuellen Schrittes. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Die Implementierung des Moduls</title>
<title>Die Implementierung des Moduls</title>
@ -686,7 +686,7 @@ private:
<para>Das Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> ist in <filename>kgenericfactory.h</filename> deklariert. Gut, nun weiter zum Konstruktor! Weil es sich hier um ein sehr einfaches Modul handelt, ist der Konstruktor ebenso einfach.</para>
<para>Das Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> ist in <filename>kgenericfactory.h</filename> deklariert. Gut, nun weiter zum Konstruktor! Weil es sich hier um ein sehr einfaches Modul handelt, ist der Konstruktor ebenso einfach.</para>
<listitem><para><function> lookTowards( const QString richtung )</function>: Richtet die Anzeigenmitte auf die Richtung aus, die durch das Argument angegeben wird. Das kann der Name jedes Objektes im Himmel sein oder einer der folgenden direktionalen Begriffe oder Abkürzungen: "zenith" (Zenit) (oder "z"), "north" (Nord) (oder "n"), "northeast" (Nordost) (oder "ne"), "east" (Osten) (oder ("e"), "southeast" (Südosten) (oder "se"), "south" (Süden) (oder "s"), "southwest" (Südwest) (oder "sw"), "west" (Westen) (oder "w") oder "northwest" (Nordwest) (oder "nw"). </para></listitem>
<listitem><para><function> lookTowards( const TQString richtung )</function>: Richtet die Anzeigenmitte auf die Richtung aus, die durch das Argument angegeben wird. Das kann der Name jedes Objektes im Himmel sein oder einer der folgenden direktionalen Begriffe oder Abkürzungen: "zenith" (Zenit) (oder "z"), "north" (Nord) (oder "n"), "northeast" (Nordost) (oder "ne"), "east" (Osten) (oder ("e"), "southeast" (Südosten) (oder "se"), "south" (Süden) (oder "s"), "southwest" (Südwest) (oder "sw"), "west" (Westen) (oder "w") oder "northwest" (Nordwest) (oder "nw"). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Fokussiert die Anzeige auf die angegebenen äquatorialen Koordinaten. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Fokussiert die Anzeige auf die angegebenen äquatorialen Koordinaten. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Pausiert für t Sekunden bevor mit den weiteren Skriptbefehlen fortgefahren wird. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Pausiert für t Sekunden bevor mit den weiteren Skriptbefehlen fortgefahren wird. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Hält die Skriptausführung solange an, bis der Benutzer die angegebene Taste drückt. An diesem Punkt können Sie keine Tastenkombinationen angeben (wie etwa <keycombo action="simul">&Strg;<keycap>C</keycap></keycombo>). Nur einfache Tasten sind erlaubt. Sie können <quote>space</quote> (engl. für Leertaste) eingeben, um die Leertaste zu bezeichnen. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Hält die Skriptausführung solange an, bis der Benutzer die angegebene Taste drückt. An diesem Punkt können Sie keine Tastenkombinationen angeben (wie etwa <keycombo action="simul">&Strg;<keycap>C</keycap></keycombo>). Nur einfache Tasten sind erlaubt. Sie können <quote>space</quote> (engl. für Leertaste) eingeben, um die Leertaste zu bezeichnen. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Kontrolliert, ob die Verfolgungsfunktion eingeschaltet ist. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Kontrolliert, ob die Verfolgungsfunktion eingeschaltet ist. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Passt eine Anzeigeeinstellung an. Es gibt Dutzende dieser Einstellungen, praktisch alles, was Sie im Fenster <guilabel>&kstars; einrichten</guilabel> verändern können. Das erste Argument ist der Name der Einstellung (Die Namen sind aus der Einstellungsdatei <filename>kstarsrc</filename> entnommen) und das zweite Argument ist der gewünschte Wert. Der Argumentleser ist sehr robust, also wenn Sie falsche Daten angeben, sollte er sich achtbar aus der Affäre ziehen. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Passt eine Anzeigeeinstellung an. Es gibt Dutzende dieser Einstellungen, praktisch alles, was Sie im Fenster <guilabel>&kstars; einrichten</guilabel> verändern können. Das erste Argument ist der Name der Einstellung (Die Namen sind aus der Einstellungsdatei <filename>kstarsrc</filename> entnommen) und das zweite Argument ist der gewünschte Wert. Der Argumentleser ist sehr robust, also wenn Sie falsche Daten angeben, sollte er sich achtbar aus der Affäre ziehen. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Ändert den Beobachtungsort in die angegebene Stadt. Wenn keine Stadt mit dem Namen des Arguments gefunden wird, passiert nichts. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Ändert den Beobachtungsort in die angegebene Stadt. Wenn keine Stadt mit dem Namen des Arguments gefunden wird, passiert nichts. </para></listitem>
<listitem><para><function> stop()</function> [Uhr]: Hält die Simulationsuhr an. </para></listitem>
<listitem><para><function> stop()</function> [Uhr]: Hält die Simulationsuhr an. </para></listitem>
<listitem><para>Allgemeine Grätefunktionen: Funktionen, um Geräte zu verbinden und zu trennen &etc;.</para>
<listitem><para>Allgemeine Grätefunktionen: Funktionen, um Geräte zu verbinden und zu trennen &etc;.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString deviceName, bool useLocal)</function> : Richtet einen INDI-Dienst entweder lokal oder als Server ein.</para></listitem>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function> : Richtet einen INDI-Dienst entweder lokal oder als Server ein.</para></listitem>
<listitem><para><function>shutdownINDI (QString deviceName)</function> : Beendet den INDI-Dienst.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function> : Beendet den INDI-Dienst.</para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function> : Verbindet zu einem INDI-Gerät oder entfernt diese Verbindung.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function> : Verbindet zu einem INDI-Gerät oder entfernt diese Verbindung.</para></listitem>
<listitem><para><function>setINDIPort(QString deviceName, QString port)</function>: Stellt den Verbindungsport des Geräts ein.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function>: Stellt den Verbindungsport des Geräts ein.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function> : Startet eine INDI Aktion. Die Aktion kann jedes beliebige <emphasis>Element</emphasis> einer <emphasis>Schaltereigenschaft</emphasis> sein.</para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function> : Startet eine INDI Aktion. Die Aktion kann jedes beliebige <emphasis>Element</emphasis> einer <emphasis>Schaltereigenschaft</emphasis> sein.</para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function> : Hält die Ausführung des Skripts an, bis die angegebene Aktion <emphasis>Eigenschaft</emphasis> mit erfolgreich beendet ist. </para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function> : Hält die Ausführung des Skripts an, bis die angegebene Aktion <emphasis>Eigenschaft</emphasis> mit erfolgreich beendet ist. </para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Teleskop Funktionen: Funktionen, um die Bewegung und den Zustand von Teleskopen zu kontrollieren.</para>
<listitem><para>Teleskop Funktionen: Funktionen, um die Bewegung und den Zustand von Teleskopen zu kontrollieren.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function> : Stellt den Modus oder eine Aktion für das Teleskop. Mögliche Optionen sind SLEW, TRACK, SYNC, PARK, und ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function> : Stellt den Modus oder eine Aktion für das Teleskop. Mögliche Optionen sind SLEW, TRACK, SYNC, PARK, und ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function> : Stellt die Zielkoordinaten des Teleskops auf <emphasis>RA</emphasis> und <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function> : Stellt die Zielkoordinaten des Teleskops auf <emphasis>RA</emphasis> und <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString deviceName, QString objectName)</function> : Stellt die Zielkoordinaten des Teleskops auf die Koordinaten von <emphasis>objectName</emphasis>. KStars sucht den Namen des Objekts in der Datenbank und gibt Rekt und Dekl zurück, wenn das Objekt gefunden wurde.</para></listitem>
<listitem><para><function>setINDITargetName(TQString deviceName, TQString objectName)</function> : Stellt die Zielkoordinaten des Teleskops auf die Koordinaten von <emphasis>objectName</emphasis>. KStars sucht den Namen des Objekts in der Datenbank und gibt Rekt und Dekl zurück, wenn das Objekt gefunden wurde.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function> : Stellt den Standort des Teleskops auf den angegebenen Längen- und Breitengrad. Der Längengrad wird von Greenwich in Großbritannien in östlicher Richtung gemessen. Während es jedoch üblich ist, negative Längengrade für die westliche Halbkugel zu verwenden, müssen die Längengrade für INDI zwischen 0 und 360 Grad eingegeben werden. Bei negativen Längengraden addieren Sie 360 Grad hinzu, um dien Eingabewert für INDI anzupassen. Zum Beispiel Calgary in Kanada hat in KStars die Koordinaten Längengrad : -114 04 58; Breitengrad : 51 02 58. Für INDI geben Sie als Längengrad 360 - 114.083 = 245,917 Grad an.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function> : Stellt den Standort des Teleskops auf den angegebenen Längen- und Breitengrad. Der Längengrad wird von Greenwich in Großbritannien in östlicher Richtung gemessen. Während es jedoch üblich ist, negative Längengrade für die westliche Halbkugel zu verwenden, müssen die Längengrade für INDI zwischen 0 und 360 Grad eingegeben werden. Bei negativen Längengraden addieren Sie 360 Grad hinzu, um dien Eingabewert für INDI anzupassen. Zum Beispiel Calgary in Kanada hat in KStars die Koordinaten Längengrad : -114 04 58; Breitengrad : 51 02 58. Für INDI geben Sie als Längengrad 360 - 114.083 = 245,917 Grad an.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function> : Stellt das Teleskop auf UTC - Datum und Zeit im Format ISO 8601. Das Format ist YYYY-MM-DDTHH:MM:SS (z. B.. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function> : Stellt das Teleskop auf UTC - Datum und Zeit im Format ISO 8601. Das Format ist YYYY-MM-DDTHH:MM:SS (z. B.. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Kamera/CCD Funktionen: Funktionen zur Kontrolle der Eigenschaften von Kamera/CCD und deren Zustand.</para>
<listitem><para>Kamera/CCD Funktionen: Funktionen zur Kontrolle der Eigenschaften von Kamera/CCD und deren Zustand.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function> : Stellt die CCD-Chip Zieltemperatur in Grad Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function> : Stellt die CCD-Chip Zieltemperatur in Grad Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString deviceName, QString type)</function> : Stellt den CCD-Rahmentyp. Mögliche Optionen sind FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, und FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function> : Stellt den CCD-Rahmentyp. Mögliche Optionen sind FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, und FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function> : Startet die Belichtung von CCD/Camera mit der durch <emphasis>timeout</emphasis> in Sekunden angegebenen Zeitdauer.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function> : Startet die Belichtung von CCD/Camera mit der durch <emphasis>timeout</emphasis> in Sekunden angegebenen Zeitdauer.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Focussierer Funktionen: Funktionen, um die Bewegung und den Zustand von Focussierern zu kontrollieren.</para>
<listitem><para>Focussierer Funktionen: Funktionen, um die Bewegung und den Zustand von Focussierern zu kontrollieren.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function> : Stellt die Geschwindigkeit des Focussierers. Mögliche Optionen sind FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, und FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function> : Stellt die Geschwindigkeit des Focussierers. Mögliche Optionen sind FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, und FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function> : Stellt die Dauer in Sekunden für alle nachfolgenden startINDIFocus-Operationen.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function> : Stellt die Dauer in Sekunden für alle nachfolgenden startINDIFocus-Operationen.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function> : Bewegt den Focussierer entweder einwärts (focusDir = 0) oder auswärts (focusDir = 1). Die Geschwindigkeit und Dauer dieser Operation wird mit den Funktionen <function>setINDIFocusSpeed()</function> und <function>setINDIFocusTimeout()</function> eingestellt.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function> : Bewegt den Focussierer entweder einwärts (focusDir = 0) oder auswärts (focusDir = 1). Die Geschwindigkeit und Dauer dieser Operation wird mit den Funktionen <function>setINDIFocusSpeed()</function> und <function>setINDIFocusTimeout()</function> eingestellt.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Filter-Funktionen: Funktionen, um die Position von Filtern einzustellen.</para>
<listitem><para>Filter-Funktionen: Funktionen, um die Position von Filtern einzustellen.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function> : Ändert die Filterposition auf <varname>filter_num</varname>. Symbolische Namen (Alias) für Filternummern können Sie im Dialog <guimenuitem>INDI einrichten</guimenuitem> aus dem Menü <guimenu>Geräte</guimenu> (z. B. Filter 1 = Rot, Filter 2 = Grün &etc;).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function> : Ändert die Filterposition auf <varname>filter_num</varname>. Symbolische Namen (Alias) für Filternummern können Sie im Dialog <guimenuitem>INDI einrichten</guimenuitem> aus dem Menü <guimenu>Geräte</guimenu> (z. B. Filter 1 = Rot, Filter 2 = Grün &etc;).</para></listitem>
<para>Eine Liste der vorhandenen &DCOP;-Schnittstellen erhalten Sie, wenn Sie das richtige Argument wie im folgenden Beispiel verwenden. <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Eine Liste der vorhandenen &DCOP;-Schnittstellen erhalten Sie, wenn Sie das richtige Argument wie im folgenden Beispiel verwenden. <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
</programlisting> <para> is something different than dereferencing a NULL pointer. You didn't tell the object at all what it is, and now you try to use it. The guess here is that you want to have a new local instance of a Arts::Synth_PLAY object. Of course you might have wanted something else (like creating the object somewhere else, or using an existing remote object). However, it is a convenient short cut to creating objects. Lazy creation will not work once you assigned something else (like a null reference). </para> <para> The equivalent C++ terms would be <programlisting>
</programlisting> <para> is something different than dereferencing a NULL pointer. You didn't tell the object at all what it is, and now you try to use it. The guess here is that you want to have a new local instance of a Arts::Synth_PLAY object. Of course you might have wanted something else (like creating the object somewhere else, or using an existing remote object). However, it is a convenient short cut to creating objects. Lazy creation will not work once you assigned something else (like a null reference). </para> <para> The equivalent C++ terms would be <programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> which obviously in C++ just plain segfaults. So this is different here. This lazy creation is tricky especially as not necessarily an implementation exists for your interface. </para> <para> For instance, consider an abstract thing like a Arts::PlayObject. There are certainly concrete PlayObjects like those for playing mp3s or wavs, but <programlisting>
</programlisting> which obviously in C++ just plain segfaults. So this is different here. This lazy creation is tricky especially as not necessarily an implementation exists for your interface. </para> <para> For instance, consider an abstract thing like a Arts::PlayObject. There are certainly concrete PlayObjects like those for playing mp3s or wavs, but <programlisting>
<para> There is no need to base a middleware for multimedia on &Qt;. Deciding so, and using all that nice &Qt;-streaming and stuff, will easily lead to the middleware becoming a &Qt;-only (or rather &kde;-only) thing. I mean: as soon as I'll see the GNOMEs using &DCOP;, too, or something like that, I am certainly proven wrong. </para>
<para> There is no need to base a middleware for multimedia on &Qt;. Deciding so, and using all that nice &Qt;-streaming and stuff, will easily lead to the middleware becoming a &Qt;-only (or rather &kde;-only) thing. I mean: as soon as I'll see the GNOMEs using &DCOP;, too, or something like that, I am certainly proven wrong. </para>
<para> While I do know that &DCOP; basically doesn't know about the data types it sends, so that you could use &DCOP; without using &Qt;, look at how it is used in daily &kde; usage: people send types like <classname>QString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ..., around. These use &Qt;-serialization. So if somebody choose to support &DCOP; in a GNOME program, he would either have to claim to use <classname>QString</classname>,... types (although he doesn't do so), and emulate the way &Qt; does the streaming, or he would send other string, pixmap and rect types around, and thus not be interoperable. </para>
<para> While I do know that &DCOP; basically doesn't know about the data types it sends, so that you could use &DCOP; without using &Qt;, look at how it is used in daily &kde; usage: people send types like <classname>TQString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ..., around. These use &Qt;-serialization. So if somebody choose to support &DCOP; in a GNOME program, he would either have to claim to use <classname>TQString</classname>,... types (although he doesn't do so), and emulate the way &Qt; does the streaming, or he would send other string, pixmap and rect types around, and thus not be interoperable. </para>
<para> Well, whatever. &arts; was always intended to work with or without &kde;, with or without &Qt;, with or without X11, and maybe even with or without &Linux; (and I have even no problems with people who port it to a popular non-free operating systems). </para>
<para> Well, whatever. &arts; was always intended to work with or without &kde;, with or without &Qt;, with or without X11, and maybe even with or without &Linux; (and I have even no problems with people who port it to a popular non-free operating systems). </para>
@ -1923,7 +1923,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Legt die Hintergrundfarbe für die Anzeige der Nachricht fest. Die Zeichenfolge kann im Format <quote>#RRGGBB</quote> (wie von <methodname>QColor::name()</methodname> zurückgegeben) übergeben werden. Alternativ kann die Zeichenfolge in jedem Format übergeben werden, das von <methodname>QColor::setNamedColor()</methodname> akzeptiert wird. Beispielsweise als Name aus der Farbdatenbank von X (⪚ <quote>red</quote> oder <quote>steelblue</quote>). Wird der Wert null als Zeichenfolge übergeben, wird die derzeit gültige Standard-Hintergrundfarbe verwendet.</para>
<para>Legt die Hintergrundfarbe für die Anzeige der Nachricht fest. Die Zeichenfolge kann im Format <quote>#RRGGBB</quote> (wie von <methodname>TQColor::name()</methodname> zurückgegeben) übergeben werden. Alternativ kann die Zeichenfolge in jedem Format übergeben werden, das von <methodname>TQColor::setNamedColor()</methodname> akzeptiert wird. Beispielsweise als Name aus der Farbdatenbank von X (⪚ <quote>red</quote> oder <quote>steelblue</quote>). Wird der Wert null als Zeichenfolge übergeben, wird die derzeit gültige Standard-Hintergrundfarbe verwendet.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2025,21 +2025,21 @@ continuously in the background and alarms are always enabled.</para>
@ -2092,7 +2092,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Gibt die Hintergrundfarbe für die Anzeige der Datei an. Die Zeichenfolge kann im Format <quote>#RRGGBB</quote> (as returned by <methodname>QColor::name()</methodname>) erfolgen, wobei RR, GG und BB zweistellige Hexadezimalwerte für Rot, Grün und Blau sind. Alternativ kann die Zeichenfolge in allen Formaten angegeben werden, die von <methodname>QColor::setNamedColor()</methodname> akzeptiert wird. Beispielsweise als Name aus der Farbdatenban von X (⪚ <quote>red</quote> or <quote>steelblue</quote>). Wird als Zeichenfolge der Wert null übergeben, wird die Datei mit der aktuell eingestellten Hintergrundfarbe dargestellt.</para>
<para>Gibt die Hintergrundfarbe für die Anzeige der Datei an. Die Zeichenfolge kann im Format <quote>#RRGGBB</quote> (as returned by <methodname>TQColor::name()</methodname>) erfolgen, wobei RR, GG und BB zweistellige Hexadezimalwerte für Rot, Grün und Blau sind. Alternativ kann die Zeichenfolge in allen Formaten angegeben werden, die von <methodname>TQColor::setNamedColor()</methodname> akzeptiert wird. Beispielsweise als Name aus der Farbdatenban von X (⪚ <quote>red</quote> or <quote>steelblue</quote>). Wird als Zeichenfolge der Wert null übergeben, wird die Datei mit der aktuell eingestellten Hintergrundfarbe dargestellt.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2178,29 +2178,29 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>Erzeugt eine neue Erinnerung, die bei Fälligkeit einen Shell-Befehl ausführt.</refpurpose>
<refpurpose>Erzeugt eine neue Erinnerung, die bei Fälligkeit einen Shell-Befehl ausführt.</refpurpose>
<refpurpose>Gibt die Versionsnummer von &karm; zurück.</refpurpose>
<refpurpose>Gibt die Versionsnummer von &karm; zurück.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString version()
<synopsis>TQString version()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -728,7 +728,7 @@ Gedruckt am: 30.01.2006 19:50
<refpurpose>Liefert den Beenden-Status von &karm; zurück.</refpurpose>
<refpurpose>Liefert den Beenden-Status von &karm; zurück.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString quit()
<synopsis>TQString quit()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -746,7 +746,7 @@ Gedruckt am: 30.01.2006 19:50
<refpurpose>Prüft, ob eine bestimmte Hauptaufgabe vorhanden ist.</refpurpose>
<refpurpose>Prüft, ob eine bestimmte Hauptaufgabe vorhanden ist.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString hastodo(QString Aufgabenname)
<synopsis>TQString hastodo(TQString Aufgabenname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parameter</title>
<title>Parameter</title>
@ -762,7 +762,7 @@ Gedruckt am: 30.01.2006 19:50
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
<title>Beschreibung</title>
<title>Beschreibung</title>
<para><function>hastodo(QString Aufgabenname)</function> ist ein &DCOP;-Aufruf, der nach einer Hauptaufgabe mit dem übergebenen Namen sucht. Wird diese gefunden, ist der Rückgabewert die iCalendar-UID der Aufgabe, ansonsten wird eine leere Zeichenkette zurückgegeben. </para>
<para><function>hastodo(TQString Aufgabenname)</function> ist ein &DCOP;-Aufruf, der nach einer Hauptaufgabe mit dem übergebenen Namen sucht. Wird diese gefunden, ist der Rückgabewert die iCalendar-UID der Aufgabe, ansonsten wird eine leere Zeichenkette zurückgegeben. </para>
<para>Es wird die Datei durchsucht, die &karm; gerade geöffnet hat. Es werden auch alle Teilaufgaben durchsucht, nicht nur die Hauptaufgaben. Falls mehrere Aufgaben den selben Namen tragen, wird die erste gefundene Aufgabe zurückgegeben.</para>
<para>Es wird die Datei durchsucht, die &karm; gerade geöffnet hat. Es werden auch alle Teilaufgaben durchsucht, nicht nur die Hauptaufgaben. Falls mehrere Aufgaben den selben Namen tragen, wird die erste gefundene Aufgabe zurückgegeben.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -776,7 +776,7 @@ Gedruckt am: 30.01.2006 19:50
<refpurpose>Fügt eine neue Aufgabe hinzu.</refpurpose>
<refpurpose>Fügt eine neue Aufgabe hinzu.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString Aufgabenname)
<synopsis>TQString addtodo(TQString Aufgabenname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parameter</title>
<title>Parameter</title>
@ -793,7 +793,7 @@ Gedruckt am: 30.01.2006 19:50
<refsect1>
<refsect1>
<title>Beschreibung</title>
<title>Beschreibung</title>
<para><function>addtodo(QString Aufgabenname)</function> ist ein &DCOP;-Aufruf, mit dem Sie eine neue Aufgabe zur geöffneten Datei hinzufügen können. Der Rückgabewert enthält die UID der neuen Aufgabe. </para>
<para><function>addtodo(TQString Aufgabenname)</function> ist ein &DCOP;-Aufruf, mit dem Sie eine neue Aufgabe zur geöffneten Datei hinzufügen können. Der Rückgabewert enthält die UID der neuen Aufgabe. </para>
<para>Dies setzt voraus, dass Sie sich innerhalb einer &kommander;-Datei befinden und Zugriff auf die Anweisung @pid haben, die die Prozess-ID enhält. Da ist es einfacher, <quote>kmdr-executor-@pid</quote> mit @dcopid zu ersetzen. Diese Syntax (möglicherweise ohne Anweisungen) kann von der Befehlszeile oder jedem externen Skript genutzt werden, um das &kommander;-Fenster zu ändern. </para>
<para>Dies setzt voraus, dass Sie sich innerhalb einer &kommander;-Datei befinden und Zugriff auf die Anweisung @pid haben, die die Prozess-ID enhält. Da ist es einfacher, <quote>kmdr-executor-@pid</quote> mit @dcopid zu ersetzen. Diese Syntax (möglicherweise ohne Anweisungen) kann von der Befehlszeile oder jedem externen Skript genutzt werden, um das &kommander;-Fenster zu ändern. </para>
<para>Weil &kommander; in seiner Alfa-Entwicklungsstufe noch keinen vollständigen Parser hat, ist die Verwendung des viel schnelleren internen &DCOP; aus einem anderen Anwendungsfenster (Konsolen-&DCOP; ist langsam) viel schwieriger, weil viele Informationen mitgegeben werden müssen, einschließlich eines Prototyps des Aufrufes. Der Aufruf oben würde so aussehen: </para>
<para>Weil &kommander; in seiner Alfa-Entwicklungsstufe noch keinen vollständigen Parser hat, ist die Verwendung des viel schnelleren internen &DCOP; aus einem anderen Anwendungsfenster (Konsolen-&DCOP; ist langsam) viel schwieriger, weil viele Informationen mitgegeben werden müssen, einschließlich eines Prototyps des Aufrufes. Der Aufruf oben würde so aussehen: </para>
<para>Zur Zeit der Erstellung sollte aufgepasst werden, dass die Schachtelung von &DCOP;-Aufrufen innerhalb von Skriptsprachkonstrukten (wie <application>bash</application>) die Verwendung von Konsolenaufrufen verlangt.<emphasis>Bei der Verwendung von internem &DCOP; werden alle &kommander;-Anweisungen zuerst ausgeführt und dann erst das Skript.</emphasis> </para>
<para>Zur Zeit der Erstellung sollte aufgepasst werden, dass die Schachtelung von &DCOP;-Aufrufen innerhalb von Skriptsprachkonstrukten (wie <application>bash</application>) die Verwendung von Konsolenaufrufen verlangt.<emphasis>Bei der Verwendung von internem &DCOP; werden alle &kommander;-Anweisungen zuerst ausgeführt und dann erst das Skript.</emphasis> </para>
<para>Es gibt einen neuen vereinfachten Weg, &DCOP; innerhalb von &kommander; zu nutzen, mittels Objektsyntax. Angenommen, der Text in einem Bedienelement namens @Zeileneingabefeld1 soll geändert werden. Dies würde so aussehen. </para>
<para>Es gibt einen neuen vereinfachten Weg, &DCOP; innerhalb von &kommander; zu nutzen, mittels Objektsyntax. Angenommen, der Text in einem Bedienelement namens @Zeileneingabefeld1 soll geändert werden. Dies würde so aussehen. </para>
<para>Liefert den Wert der angegebenen globalen Variable zurück. Wenn ein Skript aus dem &kommander;-Fenster gestartet wird, verschwinden alle (nicht-globalen) Variablen, die im Skript belegt wurden, nach Ablauf des Skripts und sind so nicht für andere Skripte oder neue Instanzen des aufrufenden Prozesses verfügbar. Der <quote>Gültigkeitsbereich</quote> global bedeutet, dass die Variable für jeden Prozess dieses Fensters existiert, bis es geschlossen wird. Diese Variablen können jederzeit mit einem weiteren <function>@setGlobal</function>-Aufruf geändert werden. </para>
<para>Liefert den Wert der angegebenen globalen Variable zurück. Wenn ein Skript aus dem &kommander;-Fenster gestartet wird, verschwinden alle (nicht-globalen) Variablen, die im Skript belegt wurden, nach Ablauf des Skripts und sind so nicht für andere Skripte oder neue Instanzen des aufrufenden Prozesses verfügbar. Der <quote>Gültigkeitsbereich</quote> global bedeutet, dass die Variable für jeden Prozess dieses Fensters existiert, bis es geschlossen wird. Diese Variablen können jederzeit mit einem weiteren <function>@setGlobal</function>-Aufruf geändert werden. </para>
<para>Erstellt eine Variable, die global im Hinblick auf den Fensterprozeß ist und weist ihr den Wert zu. Dieser Wert kann mit global(QString VariablenName) gelesen oder geändert werden. </para>
<para>Erstellt eine Variable, die global im Hinblick auf den Fensterprozeß ist und weist ihr den Wert zu. Dieser Wert kann mit global(TQString VariablenName) gelesen oder geändert werden. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString Text)</term>
<term>changeWidgetText(TQString Text)</term>
<listitem>
<listitem>
<para>Dies sollte in setWidgetText umbenannt werden und der Name ist daher veraltet. Es entfernt den angezeigten Text im Bedienelement und ersetzt ihn mit dem Parametertext. </para>
<para>Dies sollte in setWidgetText umbenannt werden und der Name ist daher veraltet. Es entfernt den angezeigten Text im Bedienelement und ersetzt ihn mit dem Parametertext. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString Text)</term>
<term>setAssociatedText(TQString Text)</term>
<listitem>
<listitem>
<para>Dies setzt den Standardtext von &kommander;. Das ist typischerweise gleich wie <quote>@widgetText</quote> um anzuzeigen, was im Bedienelement enthalten ist. Normalerweise hat man keinen Bedarf dafür, aber auf jeden Fall vorhanden. Trifft für alle Bedienelemente zu, die Text enthalten können. </para>
<para>Dies setzt den Standardtext von &kommander;. Das ist typischerweise gleich wie <quote>@widgetText</quote> um anzuzeigen, was im Bedienelement enthalten ist. Normalerweise hat man keinen Bedarf dafür, aber auf jeden Fall vorhanden. Trifft für alle Bedienelemente zu, die Text enthalten können. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>&DCOP; für Listenfeld- und Kombinationsfeld-Bedienelemente</title>
<title>&DCOP; für Listenfeld- und Kombinationsfeld-Bedienelemente</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString Element, int Index)</term>
<term>addListItem(TQString Element, int Index)</term>
<listitem>
<listitem>
<para>Fügt ein Element zu einem ListBox-Bedienelement am angegebenen Index hinzu. Der Index beginnt mit Null. Zum Hinzufügen am Ende der Liste dient -1. </para>
<para>Fügt ein Element zu einem ListBox-Bedienelement am angegebenen Index hinzu. Der Index beginnt mit Null. Zum Hinzufügen am Ende der Liste dient -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString Element)</term>
<term>addUniqueItem(TQString Element)</term>
<listitem>
<listitem>
<para>addUniqueItem fügt ein Element am Ende der Liste nur dann hinzu, wenn es einmalig ist. </para>
<para>addUniqueItem fügt ein Element am Ende der Liste nur dann hinzu, wenn es einmalig ist. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>&DCOP; für Ankreuzfeld- und Auswahlknopf-Bedienelemente</title>
<title>&DCOP; für Ankreuzfeld- und Auswahlknopf-Bedienelemente</title>
<listitem><para>The negative lookahead prevents a possible match to be acknowledged if the following part of the searched string does match its <emphasis>PATTERN</emphasis>.</para>
<listitem><para>The negative lookahead prevents a possible match to be acknowledged if the following part of the searched string does match its <emphasis>PATTERN</emphasis>.</para>
<para>The expression <userinput>const \w+\b(?!\s*&)</userinput> will match at <quote>const char</quote> in the string <quote>const char* foo</quote> while it can not match <quote>const QString</quote> in <quote>const QString& bar</quote> because the <quote>&</quote> matches the negative lookahead assertion pattern.</para>
<para>The expression <userinput>const \w+\b(?!\s*&)</userinput> will match at <quote>const char</quote> in the string <quote>const char* foo</quote> while it can not match <quote>const TQString</quote> in <quote>const TQString& bar</quote> because the <quote>&</quote> matches the negative lookahead assertion pattern.</para>
if (!(c->send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
if (!(c->send(KSplashName, "KSplashIface", "programStarted(TQString,TQString,TQString)", data))
{
{
// Some error processing here.
// Some error processing here.
}
}
@ -560,7 +560,7 @@ X-KSplash-ObjectName=Theme2k
<listitem><para>Plugin classes should provide a <literal>static</literal> function called <function>names</function> that returns a list of names by which it can be invoked.</para></listitem>
<listitem><para>Plugin classes should provide a <literal>static</literal> function called <function>names</function> that returns a list of names by which it can be invoked.</para></listitem>
<listitem><para>If the plugin can be configured in the control centre module, it should provide a <literal>ThemeEngineConfig</literal>-based class for the configuration.</para></listitem>
<listitem><para>If the plugin can be configured in the control centre module, it should provide a <literal>ThemeEngineConfig</literal>-based class for the configuration.</para></listitem>
<listitem><para>Plugin classes must override at least one of the virtual functions <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> and <function>slotUpdateSteps</function> to make it usable.</para></listitem>
<listitem><para>Plugin classes must override at least one of the virtual functions <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> and <function>slotUpdateSteps</function> to make it usable.</para></listitem>
<listitem><para>The constructor should take the form <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> so that it can be used with <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>The constructor should take the form <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> so that it can be used with <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>The last requirement may seem complicated, but, as we will see later, by adding a single line to your source files, you can usually ignore it.</para>
<para>The last requirement may seem complicated, but, as we will see later, by adding a single line to your source files, you can usually ignore it.</para>
</sect1>
</sect1>
@ -593,11 +593,11 @@ class Theme2k: public ThemeEngine
<para>Let us analyse the listing above. The <classname>Theme2k</classname> class satisfies the naming conventions, and is inherited from <classname>ThemeEngine</classname>. It provides a <methodname>Theme2k::names()</methodname>, and has a constructor that takes the required parameters: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> and also provides a simple <methodname>Theme2k::slotSetText()</methodname> method. For the moment, do not worry about the <classname>RotWidget</classname> class. It is a small widget that provides some eye candy for the user. Our plugin is very simple and does not display any icons or show a progressbar. If you would like to display icons, override the <function>slotSetPixmap</function> function. Similar functions exist for setting the progressbar range (<function>slotUpdateSteps</function>) and incrementing(<function>slotUpdateProgress</function>) the current step. </para>
<para>Let us analyse the listing above. The <classname>Theme2k</classname> class satisfies the naming conventions, and is inherited from <classname>ThemeEngine</classname>. It provides a <methodname>Theme2k::names()</methodname>, and has a constructor that takes the required parameters: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> and also provides a simple <methodname>Theme2k::slotSetText()</methodname> method. For the moment, do not worry about the <classname>RotWidget</classname> class. It is a small widget that provides some eye candy for the user. Our plugin is very simple and does not display any icons or show a progressbar. If you would like to display icons, override the <function>slotSetPixmap</function> function. Similar functions exist for setting the progressbar range (<function>slotUpdateSteps</function>) and incrementing(<function>slotUpdateProgress</function>) the current step. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementation of the plugin</title>
<title>Implementation of the plugin</title>
@ -646,7 +646,7 @@ private:
<para>The macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> is declared in <filename>kgenericfactory.h</filename>. Onwards to the constructor! Since this is a very simple plugin, the constructor is pretty straightforward.</para>
<para>The macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> is declared in <filename>kgenericfactory.h</filename>. Onwards to the constructor! Since this is a very simple plugin, the constructor is pretty straightforward.</para>
<para>The &kstars; <abbrev>DCOP</abbrev> Interface includes the following functions: <itemizedlist>
<para>The &kstars; <abbrev>DCOP</abbrev> Interface includes the following functions: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: Point the display focus in a direction specified by the argument. This can be the name of any object in the sky, or one of the following directional words or abbreviations: zenith (or z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: Point the display focus in a direction specified by the argument. This can be the name of any object in the sky, or one of the following directional words or abbreviations: zenith (or z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Point the display focus at the specified equatorial coordinates. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Point the display focus at the specified equatorial coordinates. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Pause for t seconds before continuing with subsequent script commands. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Pause for t seconds before continuing with subsequent script commands. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Halt the script execution until the user presses the specified key. At this point, you cannot specify combination keystrokes (such as <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); just use simple keys. You can type <quote>space</quote> to indicate the spacebar. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Halt the script execution until the user presses the specified key. At this point, you cannot specify combination keystrokes (such as <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); just use simple keys. You can type <quote>space</quote> to indicate the spacebar. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Adjust a view option. There are dozens and dozens of options available; basically everything you can change in the <guilabel>Configure &kstars; Window</guilabel> can be changed here as well. The first argument is the name of the option (the names are taken from the <filename>kstarsrc</filename> configuration file), and the second argument is the desired value. The argument parser is designed to be robust, so if you accidentally send it bad data it should fail gracefully. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Adjust a view option. There are dozens and dozens of options available; basically everything you can change in the <guilabel>Configure &kstars; Window</guilabel> can be changed here as well. The first argument is the name of the option (the names are taken from the <filename>kstarsrc</filename> configuration file), and the second argument is the desired value. The argument parser is designed to be robust, so if you accidentally send it bad data it should fail gracefully. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Change the observing location to the specified city. If no city matching the argument strings is found, then nothing happens. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Change the observing location to the specified city. If no city matching the argument strings is found, then nothing happens. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Halt the simulation clock. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Halt the simulation clock. </para></listitem>
<listitem><para>La anticipación negativa previene una posible coincidencia si la parte siguiente de la cadena coincide con el <emphasis>PATRÓN</emphasis>.</para>
<listitem><para>La anticipación negativa previene una posible coincidencia si la parte siguiente de la cadena coincide con el <emphasis>PATRÓN</emphasis>.</para>
<para>La expresión <userinput>const \w+\b(?!\s*&)</userinput> coincidirá con «const char» en la cadena «const char* foo», mientras que no coincidirá con «const QString» en «const QString& bar», ya que el «&» coincide con el patrón de la declaración de anticipación negativa.</para>
<para>La expresión <userinput>const \w+\b(?!\s*&)</userinput> coincidirá con «const char» en la cadena «const char* foo», mientras que no coincidirá con «const TQString» en «const TQString& bar», ya que el «&» coincide con el patrón de la declaración de anticipación negativa.</para>
<para>Antes de que su aplicación se inicie comience a trabajar, o antes de que comience a cargar complementos, &etc;, llame a &ksplash; de la siguiente forma:</para>
<para>Antes de que su aplicación se inicie comience a trabajar, o antes de que comience a cargar complementos, &etc;, llame a &ksplash; de la siguiente forma:</para>
if (!(c->send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
if (!(c->send(KSplashName, "KSplashIface", "programStarted(TQString,TQString,TQString)", data))
{
{
// Aquí se procesará el error.
// Aquí se procesará el error.
}
}
@ -596,7 +596,7 @@ X-KSplash-ObjectName=Theme2k
<listitem><para>Las clases de los complementos deberían proporcionar una función <literal>static</literal> llamada <function>names</function> que devuelva una lista de nombres que puedan ser llamados.</para></listitem>
<listitem><para>Las clases de los complementos deberían proporcionar una función <literal>static</literal> llamada <function>names</function> que devuelva una lista de nombres que puedan ser llamados.</para></listitem>
<listitem><para>Si el complemento puede configurarse en el módulo del centro de control, debería proporcionar una clase basada en <literal>ThemeEngineConfig</literal> para la configuración.</para></listitem>
<listitem><para>Si el complemento puede configurarse en el módulo del centro de control, debería proporcionar una clase basada en <literal>ThemeEngineConfig</literal> para la configuración.</para></listitem>
<listitem><para>Las clases de los complementos pueden sobreescribir, al menos, las funciones virtuales <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> y <function>slotUpdateSteps</function> para hacerlo utilizable.</para></listitem>
<listitem><para>Las clases de los complementos pueden sobreescribir, al menos, las funciones virtuales <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> y <function>slotUpdateSteps</function> para hacerlo utilizable.</para></listitem>
<listitem><para>El constructor debería tener la forma <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal>, y por tanto, puede ser utilizado con <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>El constructor debería tener la forma <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal>, y por tanto, puede ser utilizado con <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>El último requisito puede parecer complicado, pero, como se verá posteriormente bastará con añadir una línea a sus archivos fuente, y que generalmente podrá ignorar.</para>
<para>El último requisito puede parecer complicado, pero, como se verá posteriormente bastará con añadir una línea a sus archivos fuente, y que generalmente podrá ignorar.</para>
</sect1>
</sect1>
@ -629,11 +629,11 @@ class Theme2k: public ThemeEngine
<para>Analicemos el listado anterior. La clase <classname>Theme2k</classname> cumple con la convención de nombres, y está heredada de <classname>ThemeEngine</classname>. Proporciona <methodname>Theme2k::names()</methodname>, y tiene un constructor que toma los parámetros requeridos: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> y también proporciona un método simple <methodname>Theme2k::slotSetText()</methodname>. Por el momento no se preocupe de la clase <classname>RotWidget</classname>. Es un pequeño componente que proporcionará algo que le gustará al usuario. Nuestro complemento es muy simple y no muestra iconos en la barra de progreso. Si desea mostrar iconos, sobreescriba la función <function>slotSetPixmap</function>. Existen funciones similares para configurar los pasos de la barra de progreso (<function>slotUpdateSteps</function>) e incrementan el paso actual (<function>slotUpdateProgress</function>). </para>
<para>Analicemos el listado anterior. La clase <classname>Theme2k</classname> cumple con la convención de nombres, y está heredada de <classname>ThemeEngine</classname>. Proporciona <methodname>Theme2k::names()</methodname>, y tiene un constructor que toma los parámetros requeridos: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> y también proporciona un método simple <methodname>Theme2k::slotSetText()</methodname>. Por el momento no se preocupe de la clase <classname>RotWidget</classname>. Es un pequeño componente que proporcionará algo que le gustará al usuario. Nuestro complemento es muy simple y no muestra iconos en la barra de progreso. Si desea mostrar iconos, sobreescriba la función <function>slotSetPixmap</function>. Existen funciones similares para configurar los pasos de la barra de progreso (<function>slotUpdateSteps</function>) e incrementan el paso actual (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementación del complemento</title>
<title>Implementación del complemento</title>
@ -682,7 +682,7 @@ private:
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> está declarada en <filename>kgenericfactory.h</filename>. ¡Ahora vamos con el constructor! Como esta es un complemento muy sencillo, el constructor es muy sencillo.</para>
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> está declarada en <filename>kgenericfactory.h</filename>. ¡Ahora vamos con el constructor! Como esta es un complemento muy sencillo, el constructor es muy sencillo.</para>
<para>Puede obtener una lista de las interfaces &DCOP; disponibles utilizando los argumentos adecuados, como los que se muestran en este ejemplo: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Puede obtener una lista de las interfaces &DCOP; disponibles utilizando los argumentos adecuados, como los que se muestran en este ejemplo: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Es algo diferente a deshacer una referencia a un puntero NULL. No le dijo al objeto lo que es, e intenta utilizarlo. La suposición aquí es que quiere crear una nueva instancia local de un objeto Arts::Synth_PLAY. Por supuesto, puede ser que quisiera obtener algo más (como crear el objeto en alguna parte, o utilizar un objeto remoto existente). Sin embargo, es una forma rápida de crear objetos. Este tipo de creación no funcionará una vez que haya realizado una asignación (como una referencia nula). </para>
<para>Es algo diferente a deshacer una referencia a un puntero NULL. No le dijo al objeto lo que es, e intenta utilizarlo. La suposición aquí es que quiere crear una nueva instancia local de un objeto Arts::Synth_PLAY. Por supuesto, puede ser que quisiera obtener algo más (como crear el objeto en alguna parte, o utilizar un objeto remoto existente). Sin embargo, es una forma rápida de crear objetos. Este tipo de creación no funcionará una vez que haya realizado una asignación (como una referencia nula). </para>
<para>El equivalente código C++ sería <programlisting>
<para>El equivalente código C++ sería <programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> que, obviamente, en C++ provocará fallos de segmentación. Aquí esto es diferente. Esta creación es especialmente delicada puesto que puede que no exista necesariamente una implementación para su interfaz. </para>
</programlisting> que, obviamente, en C++ provocará fallos de segmentación. Aquí esto es diferente. Esta creación es especialmente delicada puesto que puede que no exista necesariamente una implementación para su interfaz. </para>
<para>No es necesario basar una plataforma multimedia en &Qt;. Una vez decidido ésto, y utilizando la serialización y otras funcionalidades de &Qt;, se podría concluir fácilmente en una plataforma solo-&Qt; (e incluso solo-&kde;). Quiero decir: tan pronto como vea a GNOME utilizando &DCOP;, o quizá algo similar, comprobaré si estaba equivocado. </para>
<para>No es necesario basar una plataforma multimedia en &Qt;. Una vez decidido ésto, y utilizando la serialización y otras funcionalidades de &Qt;, se podría concluir fácilmente en una plataforma solo-&Qt; (e incluso solo-&kde;). Quiero decir: tan pronto como vea a GNOME utilizando &DCOP;, o quizá algo similar, comprobaré si estaba equivocado. </para>
<para>Como &DCOP; no sabe nada sobre los tipos de datos que envía, podría utilizar &DCOP; sin utilizar &Qt;, veamos el uso diario que se hace de &kde;: la gente envía tipos como <classname>QString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ..., de un lado para otro. Esto utiliza la serialización &Qt;. Por eso si alguien elige soportar &DCOP; en un programa GNOME, debería utilizar tipos <classname>QString</classname>,... (aunque no lo haga de facto), y emular la forma en que &Qt; realiza la transmisión, o podría enviar otros tipos de cadena, imágenes y rectángulos, lo que dejaría de ser interoperativo. </para>
<para>Como &DCOP; no sabe nada sobre los tipos de datos que envía, podría utilizar &DCOP; sin utilizar &Qt;, veamos el uso diario que se hace de &kde;: la gente envía tipos como <classname>TQString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ..., de un lado para otro. Esto utiliza la serialización &Qt;. Por eso si alguien elige soportar &DCOP; en un programa GNOME, debería utilizar tipos <classname>TQString</classname>,... (aunque no lo haga de facto), y emular la forma en que &Qt; realiza la transmisión, o podría enviar otros tipos de cadena, imágenes y rectángulos, lo que dejaría de ser interoperativo. </para>
<para>Bueno, sea como fuere, &arts; siempre intentó funcionar con o sin &kde;, con o sin &Qt;, con o sin X11, y quizá incluso con o sin &Linux; (y no ha habido problemas con la gente que lo ha portado a un popular sistema operativo no libre). </para>
<para>Bueno, sea como fuere, &arts; siempre intentó funcionar con o sin &kde;, con o sin &Qt;, con o sin X11, y quizá incluso con o sin &Linux; (y no ha habido problemas con la gente que lo ha portado a un popular sistema operativo no libre). </para>
<para>Especifica el color de fondo para cuando se muestre el mensaje. La cadena puede tener el formato <quote>#RRGGBB</quote> (tal y como devuelve el método <methodname>QColor::name()</methodname>), donde RR, GG y BB son valores hexadecimales de dos dígitos para el rojo, el verde y el azul. Además, la cadena puede ser de cualquiera de los formatos que acepte <methodname>QColor::setNamedColor()</methodname>, como un nombre de la base de datos de colores de las X (⪚ <quote>red</quote> o <quote>steelblue</quote>). Defina la cadena como nula para indicar que se use el color de fondo predefinido actual.</para>
<para>Especifica el color de fondo para cuando se muestre el mensaje. La cadena puede tener el formato <quote>#RRGGBB</quote> (tal y como devuelve el método <methodname>TQColor::name()</methodname>), donde RR, GG y BB son valores hexadecimales de dos dígitos para el rojo, el verde y el azul. Además, la cadena puede ser de cualquiera de los formatos que acepte <methodname>TQColor::setNamedColor()</methodname>, como un nombre de la base de datos de colores de las X (⪚ <quote>red</quote> o <quote>steelblue</quote>). Defina la cadena como nula para indicar que se use el color de fondo predefinido actual.</para>
<para>Especifica el color de fondo para cuando se muestre el archivo. La cadena puede tener el formato <quote>#RRGGBB</quote> (tal y como devuelve el método <methodname>QColor::name()</methodname>), donde RR, GG y BB son valores hexadecimales de dos dígitos para el rojo, el verde y el azul. Además, la cadena puede ser de cualquiera de los otros formatos que acepta <methodname>QColor::setNamedColor()</methodname>, como un nombre de la base de datos de colores de las X (⪚ <quote>red</quote> o <quote>steelblue</quote>). Defina la cadena como nula para indicar que se use el color de fondo predefinido actual.</para>
<para>Especifica el color de fondo para cuando se muestre el archivo. La cadena puede tener el formato <quote>#RRGGBB</quote> (tal y como devuelve el método <methodname>TQColor::name()</methodname>), donde RR, GG y BB son valores hexadecimales de dos dígitos para el rojo, el verde y el azul. Además, la cadena puede ser de cualquiera de los otros formatos que acepta <methodname>TQColor::setNamedColor()</methodname>, como un nombre de la base de datos de colores de las X (⪚ <quote>red</quote> o <quote>steelblue</quote>). Defina la cadena como nula para indicar que se use el color de fondo predefinido actual.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2157,29 +2157,29 @@
<refpurpose>planifica una alarma nueva que ejecuta un comando de la shell.</refpurpose>
<refpurpose>planifica una alarma nueva que ejecuta un comando de la shell.</refpurpose>
<refpurpose>Devuelve la ejecución de «version» de &karm;.</refpurpose>
<refpurpose>Devuelve la ejecución de «version» de &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString version()
<synopsis>TQString version()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -752,7 +752,7 @@ Impreso el: 2004-07-13 18:10
<refpurpose>Devuelve la ejecución de «quit» de &karm;.</refpurpose>
<refpurpose>Devuelve la ejecución de «quit» de &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString quit()
<synopsis>TQString quit()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -770,7 +770,7 @@ Impreso el: 2004-07-13 18:10
<refpurpose>Comprueba si existe una tarea pendiente de nivel superior.</refpurpose>
<refpurpose>Comprueba si existe una tarea pendiente de nivel superior.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString hastodo(QString taskname)
<synopsis>TQString hastodo(TQString taskname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parámetros</title>
<title>Parámetros</title>
@ -786,7 +786,7 @@ Impreso el: 2004-07-13 18:10
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
<title>Descripción</title>
<title>Descripción</title>
<para><function>hastodo(QString taskname)</function> es una llamada &DCOP; que busca un nombre que se le proporciona. Si lo encuentra, devuelve el UID del iCalendar que identifica la tarea pendiente. Si no lo encuentra, devuelve una cadena vacía. </para>
<para><function>hastodo(TQString taskname)</function> es una llamada &DCOP; que busca un nombre que se le proporciona. Si lo encuentra, devuelve el UID del iCalendar que identifica la tarea pendiente. Si no lo encuentra, devuelve una cadena vacía. </para>
<para>El archivo iCalendar que ha abierto actualmente &karm; es en el que se estaba buscando. Se busca en todo el árbol, no sólo en las tareas pendientes de nivel superior. Si hay más de una tarea pendiente cuyo nombre coincida, se devuelve la primera que se encuentre.</para>
<para>El archivo iCalendar que ha abierto actualmente &karm; es en el que se estaba buscando. Se busca en todo el árbol, no sólo en las tareas pendientes de nivel superior. Si hay más de una tarea pendiente cuyo nombre coincida, se devuelve la primera que se encuentre.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -800,7 +800,7 @@ Impreso el: 2004-07-13 18:10
<refpurpose>Añade una tarea pendiente nueva.</refpurpose>
<refpurpose>Añade una tarea pendiente nueva.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString todoname)
<synopsis>TQString addtodo(TQString todoname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parámetros</title>
<title>Parámetros</title>
@ -817,7 +817,7 @@ Impreso el: 2004-07-13 18:10
<refsect1>
<refsect1>
<title>Descripción</title>
<title>Descripción</title>
<para><function>addtodo(QString todoname)</function> es una llamada &DCOP; que añade una tarea pendiente de nivel superior al almacenamiento actual. Se devuelve el UID de la nueva tarea pendiente. </para>
<para><function>addtodo(TQString todoname)</function> es una llamada &DCOP; que añade una tarea pendiente de nivel superior al almacenamiento actual. Se devuelve el UID de la nueva tarea pendiente. </para>
<para>El segundo objeto de nuestro programa es el botón pulsable, una instancia de la clase <classname>QPushButton</classname>. Hemos usado el segundo de los dos constructores que se nos ofrecen para crear una instancia de este objeto. Este constructor acepta como parámetro un texto, que será la etiqueta que mostrará el botón (aquí es la cadena «¡Hola mundo!»). Luego hemos llamado al método <methodname>resize()</methodname> para cambiar el tamaño del botón en relación a su contenido (el botón debe ser más ancho para que la cadena aparezca completamente). </para>
<para>El segundo objeto de nuestro programa es el botón pulsable, una instancia de la clase <classname>QPushButton</classname>. Hemos usado el segundo de los dos constructores que se nos ofrecen para crear una instancia de este objeto. Este constructor acepta como parámetro un texto, que será la etiqueta que mostrará el botón (aquí es la cadena «¡Hola mundo!»). Luego hemos llamado al método <methodname>resize()</methodname> para cambiar el tamaño del botón en relación a su contenido (el botón debe ser más ancho para que la cadena aparezca completamente). </para>
<para>Pero, ¿qué hay del método <methodname>show()</methodname>? Ahora veremos que, al igual que la mayor parte de de widgetds, <classname>QPushButton</classname> se basa en la herencia simple. La documentación dice que esta clase hereda de <classname>QButton</classname>. Siga el enlace de la clase <classname>QButton</classname> y verá más widgets que han sido heredados por <classname>QPushButton</classname> (y que usaremos más adelante para explicar el mecanismo señal/slot). No obstante, el método <methodname>show()</methodname> no aparece listado, por lo que también tiene que haber sido proporcionado mediante herencia. La clase de la que hereda <classname>QButton</classname> es <classname>QWidget</classname>. Vuelva a seguir el enlace y verá el gran número de métodos que proporciona <classname>QWidget</classname>, incluido el método <methodname>show()</methodname>. Ahora entendemos lo que se ha hecho con el botón en el ejemplo: <orderedlist>
<para>Pero, ¿qué hay del método <methodname>show()</methodname>? Ahora veremos que, al igual que la mayor parte de de widgetds, <classname>QPushButton</classname> se basa en la herencia simple. La documentación dice que esta clase hereda de <classname>QButton</classname>. Siga el enlace de la clase <classname>QButton</classname> y verá más widgets que han sido heredados por <classname>QPushButton</classname> (y que usaremos más adelante para explicar el mecanismo señal/slot). No obstante, el método <methodname>show()</methodname> no aparece listado, por lo que también tiene que haber sido proporcionado mediante herencia. La clase de la que hereda <classname>QButton</classname> es <classname>TQWidget</classname>. Vuelva a seguir el enlace y verá el gran número de métodos que proporciona <classname>TQWidget</classname>, incluido el método <methodname>show()</methodname>. Ahora entendemos lo que se ha hecho con el botón en el ejemplo: <orderedlist>
<listitem><para>Crear una instancia de <classname>QPushButton</classname>, usar el segundo constructor para establecer el texto del botón</para></listitem>
<listitem><para>Crear una instancia de <classname>QPushButton</classname>, usar el segundo constructor para establecer el texto del botón</para></listitem>
<listitem><para>Modificar el tamaño del widget según su contenido</para></listitem>
<listitem><para>Modificar el tamaño del widget según su contenido</para></listitem>
<listitem><para>Establecer el widget como widget principal de la instancia «a» de <classname>QApplication</classname></para></listitem>
<listitem><para>Establecer el widget como widget principal de la instancia «a» de <classname>QApplication</classname></para></listitem>
<listitem><para>Indicarle al widget que se muestre a sí mismo en la pantalla llamando a <methodname>show()</methodname>, un método heredado de <classname>QWidget</classname></para></listitem>
<listitem><para>Indicarle al widget que se muestre a sí mismo en la pantalla llamando a <methodname>show()</methodname>, un método heredado de <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Tras llamar al método <methodname>exec()</methodname> la aplicación se hace visible al usuario, mostrando una ventana con el botón, que muestra el texto «¡Hola mundo!». Tenga en cuenta que los programas gráficos se comportan de un modo algo distinto al de las aplicaciones basadas en procedimientos. El punto principal es que aquí la aplicación entra en lo que se denomina un «bucle principal de eventos». Esto significa que el programa debe esperar las acciones del usuario y luego reaccionar a ellas. Además, para una aplicación Qt, el programa tiene que estar en el bucle principal de eventos para comenzar a manejar los eventos. La siguiente sección le enseñará brevemente lo que significa esto para el programador y qué ofrece Qt para procesar los eventos del usuario. </para>
<para>Tras llamar al método <methodname>exec()</methodname> la aplicación se hace visible al usuario, mostrando una ventana con el botón, que muestra el texto «¡Hola mundo!». Tenga en cuenta que los programas gráficos se comportan de un modo algo distinto al de las aplicaciones basadas en procedimientos. El punto principal es que aquí la aplicación entra en lo que se denomina un «bucle principal de eventos». Esto significa que el programa debe esperar las acciones del usuario y luego reaccionar a ellas. Además, para una aplicación Qt, el programa tiene que estar en el bucle principal de eventos para comenzar a manejar los eventos. La siguiente sección le enseñará brevemente lo que significa esto para el programador y qué ofrece Qt para procesar los eventos del usuario. </para>
<note><para>Para los usuarios avanzados: El botón no tiene un padre declarado en el constructor, por lo que es un widget aislado de nivel superior que se ejecuta en un bucle de eventos locales que no necesita esperar al bucle de eventos principal. Consulte la documentación de la clase QWidget y la «Guía de referencia de la biblioteca KDE».</para>
<note><para>Para los usuarios avanzados: El botón no tiene un padre declarado en el constructor, por lo que es un widget aislado de nivel superior que se ejecuta en un bucle de eventos locales que no necesita esperar al bucle de eventos principal. Consulte la documentación de la clase TQWidget y la «Guía de referencia de la biblioteca KDE».</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Ahora le daremos «vida» a la aplicación procesando los eventos del usuario. Generalmente, el usuario tiene dos formas de interactuar con un programa: el ratón y el teclado. Para ambas, una interfaz gráfica de usuario debe proporcionar métodos que detecten acciones y métodos que hagan algo como respuesta a estas acciones. </para>
<para>Ahora le daremos «vida» a la aplicación procesando los eventos del usuario. Generalmente, el usuario tiene dos formas de interactuar con un programa: el ratón y el teclado. Para ambas, una interfaz gráfica de usuario debe proporcionar métodos que detecten acciones y métodos que hagan algo como respuesta a estas acciones. </para>
<para>Para ello, el sistema de ventanas envía todos los eventos de interacción a la aplicación correspondiente. El objeto <classname>QApplication</classname> los envía luego a la ventana activa como objetos <classname>QEvent</classname>, y los widgets deben decidir por sí mismos qué hacer con ellos. Cuando un widget recibe el evento, procesa el método <methodname>QWidget::event(QEvent*)</methodname>, que se encarga de decidir qué evento ha sido ejecutado y cómo reaccionar a él. Por lo tanto, <methodname>event()</methodname> es el manejador principal de eventos. A continuación, el método <methodname>event()</methodname> pasa el evento a los llamados «filtros de eventos» para determinar qué ha ocurrido y qué se debe hacer con el evento. Si no existe ningún filtro que se haga responsable para dicho evento, se llama a los manejadores de eventos especializados. Mediante ellos podemos decidir entre: <itemizedlist>
<para>Para ello, el sistema de ventanas envía todos los eventos de interacción a la aplicación correspondiente. El objeto <classname>QApplication</classname> los envía luego a la ventana activa como objetos <classname>QEvent</classname>, y los widgets deben decidir por sí mismos qué hacer con ellos. Cuando un widget recibe el evento, procesa el método <methodname>TQWidget::event(QEvent*)</methodname>, que se encarga de decidir qué evento ha sido ejecutado y cómo reaccionar a él. Por lo tanto, <methodname>event()</methodname> es el manejador principal de eventos. A continuación, el método <methodname>event()</methodname> pasa el evento a los llamados «filtros de eventos» para determinar qué ha ocurrido y qué se debe hacer con el evento. Si no existe ningún filtro que se haga responsable para dicho evento, se llama a los manejadores de eventos especializados. Mediante ellos podemos decidir entre: <itemizedlist>
<listitem><para>Eventos del teclado -- Teclas «Tabulador» y «Mayúsculas-Tabulador»:</para>
<listitem><para>Eventos del teclado -- Teclas «Tabulador» y «Mayúsculas-Tabulador»:</para>
<para>Note que todas las funciones de eventos son virtuales y protegidas, por lo que puede reimplementar los métodos encargados de manejar eventos que necesite en sus propios widgets y especificar cómo deben reaccionar. <classname>QWidget</classname> también contiene varios métodos virtuales más que pueden resultar de utilidad en sus programas. De ahí que sea recomendable conocer bien la clase <classname>QWidget</classname>. </para>
<para>Note que todas las funciones de eventos son virtuales y protegidas, por lo que puede reimplementar los métodos encargados de manejar eventos que necesite en sus propios widgets y especificar cómo deben reaccionar. <classname>TQWidget</classname> también contiene varios métodos virtuales más que pueden resultar de utilidad en sus programas. De ahí que sea recomendable conocer bien la clase <classname>TQWidget</classname>. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Interacción entre objetos mediantes señales y slots</title>
<title>Interacción entre objetos mediantes señales y slots</title>
<para>Estamos llegando a una de las ventajas más obvias del juego de herramientas Qt: el mecanismo señal/objeto, que ofrece una solución útil y provechosa para la interacción de objetos (que normalmente se resuelve mediante funciones «callback» de las herramientas del sistema X-Window). Como esta comunicación requiere una programación estricta y a menudo dificulta la creación de interfaces de usuario (como se dice en la documentación de Qt y se explica en «Programando con Qt», de K. Dalheimer), Trolltech creó un nuevo sistema en el que los objetos pueden emitir señales que se pueden conectar a métodos declarados como «slots». Desde el punto de vista del programador de C++, solo es necesario saber ciertas cosas sobre este mecanismo: <itemizedlist>
<para>Estamos llegando a una de las ventajas más obvias del juego de herramientas Qt: el mecanismo señal/objeto, que ofrece una solución útil y provechosa para la interacción de objetos (que normalmente se resuelve mediante funciones «callback» de las herramientas del sistema X-Window). Como esta comunicación requiere una programación estricta y a menudo dificulta la creación de interfaces de usuario (como se dice en la documentación de Qt y se explica en «Programando con Qt», de K. Dalheimer), Trolltech creó un nuevo sistema en el que los objetos pueden emitir señales que se pueden conectar a métodos declarados como «slots». Desde el punto de vista del programador de C++, solo es necesario saber ciertas cosas sobre este mecanismo: <itemizedlist>
<listitem><para>la declaración de una clase que use señales y slots debe contener la macro TQ_OBJECT al principio (sin punto y coma); también debe derivar de la clase <classname>QObject</classname> </para></listitem>
<listitem><para>la declaración de una clase que use señales y slots debe contener la macro TQ_OBJECT al principio (sin punto y coma); también debe derivar de la clase <classname>TQObject</classname> </para></listitem>
<listitem><para>se puede emitir una señal mediante la palabra clave «emit»; por ejemplo, «emit señal(parámetros);», desde dentro de cualquier función miembro de una clase que permita señales y slots </para></listitem>
<listitem><para>se puede emitir una señal mediante la palabra clave «emit»; por ejemplo, «emit señal(parámetros);», desde dentro de cualquier función miembro de una clase que permita señales y slots </para></listitem>
<listitem><para>todas las señales usadas por las clases que no sean heredadas deben ser añadidas a la declaración de la clase mediante una sección «signals» </para></listitem>
<listitem><para>todas las señales usadas por las clases que no sean heredadas deben ser añadidas a la declaración de la clase mediante una sección «signals» </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>el compilador de metaobjetos «moc» debe ejecutarse con el archivo de cabecera para expandir las macros y generar la implementación (que no es necesario conocer). Los archivos de salida de «moc» también son compilados por el compilador de C++. </para></listitem>
<listitem><para>el compilador de metaobjetos «moc» debe ejecutarse con el archivo de cabecera para expandir las macros y generar la implementación (que no es necesario conocer). Los archivos de salida de «moc» también son compilados por el compilador de C++. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Otra forma de usar señales sin derivar de <classname>QObject</classname> consiste en usar la clase <classname>QSignal</classname> (consulte la documentación de referencia para obtener más información y un ejemplo de uso). En lo sucesivo asumiremos que está derivando de <classname>QObject</classname>. </para>
<para>Otra forma de usar señales sin derivar de <classname>TQObject</classname> consiste en usar la clase <classname>QSignal</classname> (consulte la documentación de referencia para obtener más información y un ejemplo de uso). En lo sucesivo asumiremos que está derivando de <classname>TQObject</classname>. </para>
<para>De este modo, su clase será capaz de enviar señales a cualquier otro sitio y de proporcionar «slots» a los que se puedan conectar señales. Gracias al uso de estas señales no tendrá que preocuparse de quién va a recibirlas: solo tiene que emitir la señal, y cualquier «slot» al que quiera conectarla reaccionará a la emisión. Los «slots» también pueden ser usados como métodos normales en la implementación. </para>
<para>De este modo, su clase será capaz de enviar señales a cualquier otro sitio y de proporcionar «slots» a los que se puedan conectar señales. Gracias al uso de estas señales no tendrá que preocuparse de quién va a recibirlas: solo tiene que emitir la señal, y cualquier «slot» al que quiera conectarla reaccionará a la emisión. Los «slots» también pueden ser usados como métodos normales en la implementación. </para>
<para>Ahora, para conectar una señal a un «slot», tendrá que usar los métodos <methodname>connect()</methodname> proporcionados por la clase <classname>QObject</classname> o, cuando estén disponibles, otros métodos especiales proporcionados por diversos objetos para establecer la conexión con ciertas señales. </para>
<para>Ahora, para conectar una señal a un «slot», tendrá que usar los métodos <methodname>connect()</methodname> proporcionados por la clase <classname>TQObject</classname> o, cuando estén disponibles, otros métodos especiales proporcionados por diversos objetos para establecer la conexión con ciertas señales. </para>
<para>Como puede comprobar, la única adición para dar más interacción al botón consiste en usar un método <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ));</methodname> es todo cuanto tiene que añadir. ¿Cuál es su significado? La declaración de la clase QObject dice lo siguiente sobre el método <methodname>connect()</methodname>: </para>
<para>Como puede comprobar, la única adición para dar más interacción al botón consiste en usar un método <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ));</methodname> es todo cuanto tiene que añadir. ¿Cuál es su significado? La declaración de la clase TQObject dice lo siguiente sobre el método <methodname>connect()</methodname>: </para>
<para>Esto significa que debe especificar como primer parámetro un puntero de una instancia de la clase <classname>QObject</classname>, que es el emisor de la señal (lo que significa que puede emitir esta señal); a continuación debe especificar la señal que desea conectar. Los dos últimos parámetros son, en primer lugar, el objeto receptor que proporciona un «slot», y, finalmente, la función miembro de dicho objeto que va a actuar como «slot» (y que será ejecutada tras la emisión de la señal). </para>
<para>Esto significa que debe especificar como primer parámetro un puntero de una instancia de la clase <classname>TQObject</classname>, que es el emisor de la señal (lo que significa que puede emitir esta señal); a continuación debe especificar la señal que desea conectar. Los dos últimos parámetros son, en primer lugar, el objeto receptor que proporciona un «slot», y, finalmente, la función miembro de dicho objeto que va a actuar como «slot» (y que será ejecutada tras la emisión de la señal). </para>
<para>Mediante el uso de señales y «slots», los objetos de su programa pueden interactuar con otros fácilmente sin depender explícitamente del tipo de objeto receptor. Aprenderá más sobre el uso de este mecanismo para usos productivos en sucesivas secciones de este manual. También puede encontrar más información sobre el mecanismo de señales y «slots» en la <ulink url="developer.kde.org/documentation/library/libraryref.html">Guía de referencia de la biblioteca KDE</ulink> y la <ulink url="doc.trolltech.com">referencia en línea de Qt</ulink>. </para>
<para>Mediante el uso de señales y «slots», los objetos de su programa pueden interactuar con otros fácilmente sin depender explícitamente del tipo de objeto receptor. Aprenderá más sobre el uso de este mecanismo para usos productivos en sucesivas secciones de este manual. También puede encontrar más información sobre el mecanismo de señales y «slots» en la <ulink url="developer.kde.org/documentation/library/libraryref.html">Guía de referencia de la biblioteca KDE</ulink> y la <ulink url="doc.trolltech.com">referencia en línea de Qt</ulink>. </para>
<para>Vea que en primer lugar hemos cambiado de <classname>QApplication</classname> a <classname>TDEApplication </classname>. Además, hemos tenido que cambiar elmétodo <methodname>setMainWidget()</methodname> anteriormente usado por <methodname>setTopWidget</methodname>, que utiliza <classname>TDEApplication</classname> para establecer el «widget» principal. ¡Y ya está! Su primera aplicación de KDE ya está terminada. Ahora solo le falta indicarle al compilador la ruta de inclusión de KDE, y al enlazador que utilice la biblioteca tdecore mediante el parámetro -ltdecore. </para>
<para>Vea que en primer lugar hemos cambiado de <classname>QApplication</classname> a <classname>TDEApplication </classname>. Además, hemos tenido que cambiar elmétodo <methodname>setMainWidget()</methodname> anteriormente usado por <methodname>setTopWidget</methodname>, que utiliza <classname>TDEApplication</classname> para establecer el «widget» principal. ¡Y ya está! Su primera aplicación de KDE ya está terminada. Ahora solo le falta indicarle al compilador la ruta de inclusión de KDE, y al enlazador que utilice la biblioteca tdecore mediante el parámetro -ltdecore. </para>
<para>Como ahora ya sabe qué suele proporcionar como mínimo la función <function>main()</function>, cómo se hace visible una aplicación y cómo permite la interacción entre usuario y objetos, seguiremos con el siguiente capítulo, donde nuestra primera aplicación se construirá con &tdevelop;. Ahí tambień podrá probar todo lo que se ha dicho hasta ahora y comprobar sus efectos. </para>
<para>Como ahora ya sabe qué suele proporcionar como mínimo la función <function>main()</function>, cómo se hace visible una aplicación y cómo permite la interacción entre usuario y objetos, seguiremos con el siguiente capítulo, donde nuestra primera aplicación se construirá con &tdevelop;. Ahí tambień podrá probar todo lo que se ha dicho hasta ahora y comprobar sus efectos. </para>
<para>Adicionalmente, hasta ahora ha consultado la documentación de referencia de Qt, especialmente las clases <classname>QApplication</classname>, <classname>QWidget</classname> y <classname>QObject</classname>, y la documentación de la biblioteca «tdecore» sobre la clase <classname>TDEApplication</classname>. El <ulink url="developer.kde.org/documentation/library/libraryref.html"> Manual d referencia de la biblioteca KDE</ulink> también contiene una completa descripción sobre cómo llamar a los constructores de <classname>QApplication</classname> y de <classname>TDEApplication</classname>, incluido el procesamiento de los argumentos pasados como parámetros en la línea de comando. </para>
<para>Adicionalmente, hasta ahora ha consultado la documentación de referencia de Qt, especialmente las clases <classname>QApplication</classname>, <classname>TQWidget</classname> y <classname>TQObject</classname>, y la documentación de la biblioteca «tdecore» sobre la clase <classname>TDEApplication</classname>. El <ulink url="developer.kde.org/documentation/library/libraryref.html"> Manual d referencia de la biblioteca KDE</ulink> también contiene una completa descripción sobre cómo llamar a los constructores de <classname>QApplication</classname> y de <classname>TDEApplication</classname>, incluido el procesamiento de los argumentos pasados como parámetros en la línea de comando. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // permitir que la vista pueda cambiar la barra de estado y el título
18 // permitir que la vista pueda cambiar la barra de estado y el título
<para>Tampoco es necesario decir que la estabilidad es uno de los principales objetivos del diseño. Nadie puede evitar los errores, pero se puede conseguir bastante mediante objetivos diseñados inteligentemente y el amplio uso de diseños orientados a objetos. C++ hace que la programación sea un juego si sabe cómo explotar sus capacidades: herencia, ocultación de información y reusabilidad del código existente. </para>
<para>Tampoco es necesario decir que la estabilidad es uno de los principales objetivos del diseño. Nadie puede evitar los errores, pero se puede conseguir bastante mediante objetivos diseñados inteligentemente y el amplio uso de diseños orientados a objetos. C++ hace que la programación sea un juego si sabe cómo explotar sus capacidades: herencia, ocultación de información y reusabilidad del código existente. </para>
<para>Cuando cree un proyecto KDE o Qt, siempre tendrá una vista que herede de QWidget, ya sea por herencia directa o porque el widget de la biblioteca que desea usar hereda de QWidget. De ahí que el asistente para aplicaciones haya construido una vista que es una instancia de una clase «aplicaciónView», que hereda de QWidget. </para>
<para>Cuando cree un proyecto KDE o Qt, siempre tendrá una vista que herede de TQWidget, ya sea por herencia directa o porque el widget de la biblioteca que desea usar hereda de TQWidget. De ahí que el asistente para aplicaciones haya construido una vista que es una instancia de una clase «aplicaciónView», que hereda de TQWidget. </para>
<para>Este capítulo describe cómo usar widgets de bibliotecas para crear vistas para aplicaciones de KDE o Qt que han sido generadas con &tdevelop;. Luego veremos las bibliotecas y qué tipo de vistas nos ofrecen. </para>
<para>Este capítulo describe cómo usar widgets de bibliotecas para crear vistas para aplicaciones de KDE o Qt que han sido generadas con &tdevelop;. Luego veremos las bibliotecas y qué tipo de vistas nos ofrecen. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>Si observa la primera página de la documentación en línea de Qt encontrará un enlace a «capturas de pantalla de los widgets», donde podrá ver cómo son los widgets que contiene Qt. Estos widgets están listos para usar y pueden ser combinados entre sí para formar widgets más complicados que le permitirán crear vistas y diálogos para su aplicación. A continuación describiremos algunos de estos widgets que le resultarán de utilidad para crear vistas de aplicaciones, pero recuerde que las bibliotecas de KDE suelen contener otros widgets para el mismo propósito. Veremos esto en la próxima sección. </para>
<para>Si observa la primera página de la documentación en línea de Qt encontrará un enlace a «capturas de pantalla de los widgets», donde podrá ver cómo son los widgets que contiene Qt. Estos widgets están listos para usar y pueden ser combinados entre sí para formar widgets más complicados que le permitirán crear vistas y diálogos para su aplicación. A continuación describiremos algunos de estos widgets que le resultarán de utilidad para crear vistas de aplicaciones, pero recuerde que las bibliotecas de KDE suelen contener otros widgets para el mismo propósito. Veremos esto en la próxima sección. </para>
<para>A continuación le damos una lista de pistas sobre para qué propósito puede usar cada componente de Qt: <orderedlist>
<para>A continuación le damos una lista de pistas sobre para qué propósito puede usar cada componente de Qt: <orderedlist>
<listitem><para>Si el área de su vista no es lo suficientemente amplia para mostrar todos sus datos, el usuario debería poder desplazarse por el documento con barras situadas a la derecha y en la parte inferior de la vista. Para ello, Qt proporciona la clase <classname>QScrollView</classname>, que ofrece un área hija que se puede desplazar. Como se ha explicado, puede derivar su propio widget de la clase <classname>QScrollView</classname> o usar una instancia de ella para gestionar el widget que contendrá la vista de su documento. </para></listitem>
<listitem><para>Si el área de su vista no es lo suficientemente amplia para mostrar todos sus datos, el usuario debería poder desplazarse por el documento con barras situadas a la derecha y en la parte inferior de la vista. Para ello, Qt proporciona la clase <classname>QScrollView</classname>, que ofrece un área hija que se puede desplazar. Como se ha explicado, puede derivar su propio widget de la clase <classname>QScrollView</classname> o usar una instancia de ella para gestionar el widget que contendrá la vista de su documento. </para></listitem>
<listitem><para>Para crear una vista propia que se pueda deslazar, derive su widget de vista de la clase <classname>QWidget</classname> y añada un <classname>QScrollBar</classname> horizontal y otro vertical (esto es lo que hace, por ejemplo, el widget TDEHTMLView de KDE). </para></listitem>
<listitem><para>Para crear una vista propia que se pueda deslazar, derive su widget de vista de la clase <classname>TQWidget</classname> y añada un <classname>QScrollBar</classname> horizontal y otro vertical (esto es lo que hace, por ejemplo, el widget TDEHTMLView de KDE). </para></listitem>
<listitem><para>Para procesar texto, utilice <classname>QTextEdit</classname>. Esta clase proporciona un widget con un completo editor de texto que es capaz de cortar, copiar y pegar texto, y está gestionado por una vista que se puede desplazar. </para></listitem>
<listitem><para>Para procesar texto, utilice <classname>QTextEdit</classname>. Esta clase proporciona un widget con un completo editor de texto que es capaz de cortar, copiar y pegar texto, y está gestionado por una vista que se puede desplazar. </para></listitem>
<listitem><para>Use <classname>QTable</classname> para mostrar datos organizados en forma de tabla. Como <classname>QTable</classname> también está dotada de barras de desplazamiento, ofrece una buena solución para aplicaciones de cálculo de tablas. </para></listitem>
<listitem><para>Use <classname>QTable</classname> para mostrar datos organizados en forma de tabla. Como <classname>QTable</classname> también está dotada de barras de desplazamiento, ofrece una buena solución para aplicaciones de cálculo de tablas. </para></listitem>
<listitem><para>Para mostrar dos widgets diferentes o dos instancias del mismo widget a la vez, utilice <classname>QSplitter</classname>. Esta clase le permite distribuir las vistas mediante divisores horizontales o verticales. KMail es un buen ejemplo de la apariencia de esta clase (la vista principal está dividida verticalmente por un «splitter» o divisor, y la ventana de la derecha también está dividida horizontalmente). </para></listitem>
<listitem><para>Para mostrar dos widgets diferentes o dos instancias del mismo widget a la vez, utilice <classname>QSplitter</classname>. Esta clase le permite distribuir las vistas mediante divisores horizontales o verticales. KMail es un buen ejemplo de la apariencia de esta clase (la vista principal está dividida verticalmente por un «splitter» o divisor, y la ventana de la derecha también está dividida horizontalmente). </para></listitem>
@ -653,7 +653,7 @@ return a.exec();
<title>Configuración de los accesos rápidos de teclado</title>
<title>Configuración de los accesos rápidos de teclado</title>
<para>Los accesos rápidos de teclado son algo muy profesional que siempre debería añadir a sus aplicaciones. Son usados principalmente por usuarios avanzados que desean trabajar más rápido con sus aplicaciones. Para implementarlos, las bibliotecas de KDE ofrecen la clase <classname>TDEAction</classname>, que proporciona las teclas de acceso rápido y también brinda acceso a los aceleradores de teclado estándares configurados globalmente. </para>
<para>Los accesos rápidos de teclado son algo muy profesional que siempre debería añadir a sus aplicaciones. Son usados principalmente por usuarios avanzados que desean trabajar más rápido con sus aplicaciones. Para implementarlos, las bibliotecas de KDE ofrecen la clase <classname>TDEAction</classname>, que proporciona las teclas de acceso rápido y también brinda acceso a los aceleradores de teclado estándares configurados globalmente. </para>
<para>De forma predeterminada, las aplicaciones generadas con &tdevelop; solo utilizan accesos rápidos de teclado estándares, como «F1» para acceder a la ayuda en línea, «Ctrl+N» para «Nuevo archivo», etc. </para>
<para>De forma predeterminada, las aplicaciones generadas con &tdevelop; solo utilizan accesos rápidos de teclado estándares, como «F1» para acceder a la ayuda en línea, «Ctrl+N» para «Nuevo archivo», etc. </para>
<para>Si su aplicación contiene gran número de aceleradores, debería hacer que se pudieran configurar desde el menú de «Opciones», ya sea combinados con la configuración de otras aplicaciones en un QWidget o bien de modo aislado. La biblioteca de KDE proporciona una clase <classname>KKeyChooser</classname> para usar en diálogos que contienen pestañas, para los que <classname>KKeyDialog</classname> proporciona un diálogo de configuración de teclas listo para usar. </para>
<para>Si su aplicación contiene gran número de aceleradores, debería hacer que se pudieran configurar desde el menú de «Opciones», ya sea combinados con la configuración de otras aplicaciones en un TQWidget o bien de modo aislado. La biblioteca de KDE proporciona una clase <classname>KKeyChooser</classname> para usar en diálogos que contienen pestañas, para los que <classname>KKeyDialog</classname> proporciona un diálogo de configuración de teclas listo para usar. </para>
</sect1>
</sect1>
</chapter>
</chapter>
@ -696,7 +696,7 @@ return a.exec();
<sect1 id="c8s4">
<sect1 id="c8s4">
<title>El botón <guibutton>¿Qué es esto?</guibutton></title>
<title>El botón <guibutton>¿Qué es esto?</guibutton></title>
<para>El botón <guibutton>¿Qué es esto?</guibutton> proporciona ventanas de ayuda con la idea de que el usuario necesita ayuda sobre cierto widget de la vista activa o de un elemento de una barra de herramientas. Se suele colocar en la misma barra de herramientas y se activa cuando el usuario pulsa su botón. El cursor cambia a una flecha con un signo de interrogación (con el mismo aspecto que muestra el botón). A partir de ese momento, el usuario puede pulsar sobre cualquier widget visible y obtener una ventana de ayuda. Como ejercicio, pruebe el comportamiento del botón <guibutton>¿Qué es esto?</guibutton> de &tdevelop;. </para>
<para>El botón <guibutton>¿Qué es esto?</guibutton> proporciona ventanas de ayuda con la idea de que el usuario necesita ayuda sobre cierto widget de la vista activa o de un elemento de una barra de herramientas. Se suele colocar en la misma barra de herramientas y se activa cuando el usuario pulsa su botón. El cursor cambia a una flecha con un signo de interrogación (con el mismo aspecto que muestra el botón). A partir de ese momento, el usuario puede pulsar sobre cualquier widget visible y obtener una ventana de ayuda. Como ejercicio, pruebe el comportamiento del botón <guibutton>¿Qué es esto?</guibutton> de &tdevelop;. </para>
<para>Para añadir ayudas «¿Qué es esto?» a cualquiera de sus widgets, utilice el método estático <methodname>QWhatsThis::add(QWidget *widget, const QString &texto)</methodname> </para>
<para>Para añadir ayudas «¿Qué es esto?» a cualquiera de sus widgets, utilice el método estático <methodname>QWhatsThis::add(TQWidget *widget, const TQString &texto)</methodname> </para>
<para>El model de gráficos de bajo nivel de Qt se basa en las capacidades proporcionadas por X11 y otros sitemas de ventanas para los que existen versiones de Qt. Pero también extiende las opciones mencionadas implementando características adicionales como transformaciones de tamaño arbitrario para textos y mapas de pixels. </para>
<para>El model de gráficos de bajo nivel de Qt se basa en las capacidades proporcionadas por X11 y otros sitemas de ventanas para los que existen versiones de Qt. Pero también extiende las opciones mencionadas implementando características adicionales como transformaciones de tamaño arbitrario para textos y mapas de pixels. </para>
<para>La clase central para la realización de gráficos 2D en Qt es <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Puede dibujar en un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Hay implementados tres dispositivos de pintura posibles: uno es <ulink url="kdeapi:qt/QWidget">QWidget</ulink>, que representa un widget de la pantalla. El segundo es <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> que representa una impresora y produce salida PostScript. El tercero es la clase <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, que almacena comandos de dibujo y puede guardarlos en el disco para reproducirlos posteriormente. Un formato de almacenamiento posible para los comandos de dibujo es el estándar de W3C denominado SVG. </para>
<para>La clase central para la realización de gráficos 2D en Qt es <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Puede dibujar en un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Hay implementados tres dispositivos de pintura posibles: uno es <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink>, que representa un widget de la pantalla. El segundo es <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> que representa una impresora y produce salida PostScript. El tercero es la clase <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, que almacena comandos de dibujo y puede guardarlos en el disco para reproducirlos posteriormente. Un formato de almacenamiento posible para los comandos de dibujo es el estándar de W3C denominado SVG. </para>
<para>Por lo tanto, es posible reutilizar el código de procesado que se utiliza para mostrar un widget en su impresión posterior, con las mismas características soportadas. Obviamente, en la práctica, el código se utiliza en un contexto ligeramente distinto. El dibujo en un widget se realiza casi exclusivamente en el método paintEvent() de la clase del widget. </para>
<para>Por lo tanto, es posible reutilizar el código de procesado que se utiliza para mostrar un widget en su impresión posterior, con las mismas características soportadas. Obviamente, en la práctica, el código se utiliza en un contexto ligeramente distinto. El dibujo en un widget se realiza casi exclusivamente en el método paintEvent() de la clase del widget. </para>
<para>QBrush::QBrush(BrushStyle) - Crea una brocha negra con uno de los siguientes patrones mostrados a continuación.</para>
<para>QBrush::QBrush(BrushStyle) - Crea una brocha negra con uno de los siguientes patrones mostrados a continuación.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, BrushStyle) - Crea una brocha de color con uno de los patrones mostrados a continuación.</para>
<para>QBrush::QBrush(const TQColor &, BrushStyle) - Crea una brocha de color con uno de los patrones mostrados a continuación.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, const QPixmap) - Crea una brocha de color con el patrón personalizado que se proporcione como segundo parámetro.</para>
<para>QBrush::QBrush(const TQColor &, const QPixmap) - Crea una brocha de color con el patrón personalizado que se proporcione como segundo parámetro.</para>
<para>Los colores juegan un papel tanto al ajustar curvas como al rellenar figuras. En Qt, los colores están representados por la clase <ulink url="kdeapi:qt/QColor">QColor</ulink>. Qt no soporta características gráficas avanzadas como perfiles de color ICC y corrección de color. Los colores se construyen normalmente especificando sus componentes rojo, verde y azul, siguiendo el modelo RGB que utilizan los monitores para dibujar los pixels. </para>
<para>Los colores juegan un papel tanto al ajustar curvas como al rellenar figuras. En Qt, los colores están representados por la clase <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. Qt no soporta características gráficas avanzadas como perfiles de color ICC y corrección de color. Los colores se construyen normalmente especificando sus componentes rojo, verde y azul, siguiendo el modelo RGB que utilizan los monitores para dibujar los pixels. </para>
<para>También es posible utilizar tono, saturación y valor. Esta representación (HSV) es la que se utiliza en el diálogo de color de Gtk, por ejemplo en GIMP. En este caso, el tono corresponde al ángulo en la rueda de color, mientras que la saturación corresponde a la distancia desde el centro de círuclo. El valor se puede elegir con un selector independiente. </para>
<para>También es posible utilizar tono, saturación y valor. Esta representación (HSV) es la que se utiliza en el diálogo de color de Gtk, por ejemplo en GIMP. En este caso, el tono corresponde al ángulo en la rueda de color, mientras que la saturación corresponde a la distancia desde el centro de círuclo. El valor se puede elegir con un selector independiente. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corresponde directamente a los objetos de mapas de pixels de X11. Los mapas de pixels son objetos del lado del servidor y pueden (en la mayoría de las tarjetas gráficas modernas) ser almacenadas directamente en la memoria de la tarjeta. Esto hace que sean <emphasis>muy</emphasis> eficientes para tranferir mapas de pixels a la pantalla. Los mapas de pixels también funcionan como los equivales de fuera de la pantalla de los widgets; la clase QPixmap es una subclase de QPaintDevice, por lo que es posible dibujarla con un QPainter. Las operaciones elementales de dibujo normalmente se ven aceleradas por los adaptadores gráficos modernos. Por lo tanto, una conducta muy habitual es la de utilizar mapas de pixels para trabajar con doble buffer. Esto significa, en vez de dibujar directamente sobre un widget, que sea crea un objeto de mapa de pixels temporal y se utiliza la función <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> para tranferir el mapa de pixels al widget. En casos de redibujados complejos, esto ayuda a evitar el efecto de parpadeo. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corresponde directamente a los objetos de mapas de pixels de X11. Los mapas de pixels son objetos del lado del servidor y pueden (en la mayoría de las tarjetas gráficas modernas) ser almacenadas directamente en la memoria de la tarjeta. Esto hace que sean <emphasis>muy</emphasis> eficientes para tranferir mapas de pixels a la pantalla. Los mapas de pixels también funcionan como los equivales de fuera de la pantalla de los widgets; la clase QPixmap es una subclase de QPaintDevice, por lo que es posible dibujarla con un QPainter. Las operaciones elementales de dibujo normalmente se ven aceleradas por los adaptadores gráficos modernos. Por lo tanto, una conducta muy habitual es la de utilizar mapas de pixels para trabajar con doble buffer. Esto significa, en vez de dibujar directamente sobre un widget, que sea crea un objeto de mapa de pixels temporal y se utiliza la función <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> para tranferir el mapa de pixels al widget. En casos de redibujados complejos, esto ayuda a evitar el efecto de parpadeo. </para>
<para>Por contra, el objeto <ulink url="kdeapi:qt/QImage">QImage</ulink> permanece en el lado del cliente. Su ventaja está en que proporciona acceso directo a los pixels de la imagen. Esto lo hace útil para la manipulación de imágenes, y operaciones como la carga y almacenamiento en disco (el método load() de QPixmap utiliza QImage en un paso intermedio). Por otro lado, dibujar una imagen en un widget es una operación con un consumo de recursos relativamente alto, ya que implica una transferencia al servidor X, lo que puede llevar algún tiempo, especialmente en imágenes grandes y servidores remotos. Dependiendo de la profundidad de color, la conversión de QImage a QPixmap puede requerir también un proceso de reducción del número de colores. </para>
<para>Por contra, el objeto <ulink url="kdeapi:qt/TQImage">TQImage</ulink> permanece en el lado del cliente. Su ventaja está en que proporciona acceso directo a los pixels de la imagen. Esto lo hace útil para la manipulación de imágenes, y operaciones como la carga y almacenamiento en disco (el método load() de QPixmap utiliza TQImage en un paso intermedio). Por otro lado, dibujar una imagen en un widget es una operación con un consumo de recursos relativamente alto, ya que implica una transferencia al servidor X, lo que puede llevar algún tiempo, especialmente en imágenes grandes y servidores remotos. Dependiendo de la profundidad de color, la conversión de TQImage a QPixmap puede requerir también un proceso de reducción del número de colores. </para>
<para>Es posible dibujar texto con una de las variantes sobrecargadas del método QPainter::drawText(). De esta forma se dibuja una QString en un punto o en un rectángulo dado, utilizando la fuente establecida por QPainter::setFont(). También hay un parámetro que admite una combinación OR de algunos parámetros obtenidos de las enumeraciones <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> y <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>Es posible dibujar texto con una de las variantes sobrecargadas del método QPainter::drawText(). De esta forma se dibuja una TQString en un punto o en un rectángulo dado, utilizando la fuente establecida por QPainter::setFont(). También hay un parámetro que admite una combinación OR de algunos parámetros obtenidos de las enumeraciones <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> y <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>A partir de la versión 3.0, Qt se encarga completamente de la disposición del texto incluso en los idiomas escritos de derecha a izquierda. </para>
<para>A partir de la versión 3.0, Qt se encarga completamente de la disposición del texto incluso en los idiomas escritos de derecha a izquierda. </para>
<para>Además de las entradas usuales, este ejemplo demuestra cómo declarar que un servicio posee algunas propiedades. Cada definición de propiedad corresponde a un grupo <literal>[PropertyDef::name]</literal> en el archivo de configuración. En este grupo, la entrada <literal>Type</literal> declara el tipo de la propiedad. Los tipos posibles son cualquier cosa que se pueda almacenar en un <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Además de las entradas usuales, este ejemplo demuestra cómo declarar que un servicio posee algunas propiedades. Cada definición de propiedad corresponde a un grupo <literal>[PropertyDef::name]</literal> en el archivo de configuración. En este grupo, la entrada <literal>Type</literal> declara el tipo de la propiedad. Los tipos posibles son cualquier cosa que se pueda almacenar en un <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Una vez que disponga de un objeto <classname>KService</classname>, solo necesita cargar la biblioteca y obtener un puntero a su objeto fábrica: </para>
<para>Una vez que disponga de un objeto <classname>KService</classname>, solo necesita cargar la biblioteca y obtener un puntero a su objeto fábrica: </para>
if (!client->isApplicationRegistered("tdeio_uiserver")) {
if (!client->isApplicationRegistered("tdeio_uiserver")) {
QString error;
TQString error;
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
cout << "El inicio de kioserver ha fallado con el mensaje " << error << endl;
cout << "El inicio de kioserver ha fallado con el mensaje " << error << endl;
}
}
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>En el ejemplo propuesto, el servicio se inició «por nombre»; es decir, el primer argumento de <function>TDEApplication::startServiceByName()</function> es el nombre que aparece en la línea <literal>Name</literal> del archivo «desktop». Una alternativa consiste en usar <function>TDEApplication::startServiceByDesktopName()</function>, que toma el nombre del archivo «desktop» como argumento (en este caso, <literal>«tdeio_uiserver.desktop»</literal>). </para>
<para>En el ejemplo propuesto, el servicio se inició «por nombre»; es decir, el primer argumento de <function>TDEApplication::startServiceByName()</function> es el nombre que aparece en la línea <literal>Name</literal> del archivo «desktop». Una alternativa consiste en usar <function>TDEApplication::startServiceByDesktopName()</function>, que toma el nombre del archivo «desktop» como argumento (en este caso, <literal>«tdeio_uiserver.desktop»</literal>). </para>
<para>Todas estas llamadas tienen una lista de URL como segundo parámetro, que se proporciona al servicio en la línea de comando. El tercer argumento es un puntero a una clase <classname>QString</classname>. Si el inicio del servicio falla, este argumento contendrá un mensaje de error traducido. </para>
<para>Todas estas llamadas tienen una lista de URL como segundo parámetro, que se proporciona al servicio en la línea de comando. El tercer argumento es un puntero a una clase <classname>TQString</classname>. Si el inicio del servicio falla, este argumento contendrá un mensaje de error traducido. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Por supuesto, incluso KMimeMagic sólo es capaz de determinar un tipo de archivo a partir del contenido de un archivo local. Para los archivos remotos existe otra posibilidad adicional: </para>
<para>Por supuesto, incluso KMimeMagic sólo es capaz de determinar un tipo de archivo a partir del contenido de un archivo local. Para los archivos remotos existe otra posibilidad adicional: </para>
<para>Asume que está dentro de un archivo de &kommander; y que tiene acceso al especial @pid, que contiene el id. del proceso. De hecho, es más fácil reemplazar <quote>kmdr-executor-@pid</quote> por @dcopid. Sin embargo, puede usar esta sintaxis (obviamente, sin los especiales) desde la línea de órdenes o desde cualquier guión exteno para alterar la ventana de &kommander;. </para>
<para>Asume que está dentro de un archivo de &kommander; y que tiene acceso al especial @pid, que contiene el id. del proceso. De hecho, es más fácil reemplazar <quote>kmdr-executor-@pid</quote> por @dcopid. Sin embargo, puede usar esta sintaxis (obviamente, sin los especiales) desde la línea de órdenes o desde cualquier guión exteno para alterar la ventana de &kommander;. </para>
<para>Debido a que &kommander; no tiene un analizador completo en su estado alfa, si quiere usar el &DCOP; interno mucho más rápido para la ventana de otra aplicación (&DCOP; en consola es muy lento) es más complicado porque debe dar mucha información, entre la que se incluye un prototipo para la llamada. La llamada de lo de arriba sería así: </para>
<para>Debido a que &kommander; no tiene un analizador completo en su estado alfa, si quiere usar el &DCOP; interno mucho más rápido para la ventana de otra aplicación (&DCOP; en consola es muy lento) es más complicado porque debe dar mucha información, entre la que se incluye un prototipo para la llamada. La llamada de lo de arriba sería así: </para>
<para>En el momento de escribir este manual, debería evitar anidar llamadas &DCOP; dentro de las estructuras de lenguajes de guiones (como <application>bash</application>), lo que significa que debería usar métodos de llamada desde consola. <emphasis>Si usa &DCOP; interno, todos los especiales de &kommander; se ejecutarán primero y luego se ejecutará el guión.</emphasis> </para>
<para>En el momento de escribir este manual, debería evitar anidar llamadas &DCOP; dentro de las estructuras de lenguajes de guiones (como <application>bash</application>), lo que significa que debería usar métodos de llamada desde consola. <emphasis>Si usa &DCOP; interno, todos los especiales de &kommander; se ejecutarán primero y luego se ejecutará el guión.</emphasis> </para>
<para>Hay una forma simplificada de usar &DCOP; desde dentro de &kommander;, usando la sintaxis del objeto. Digamos que quiere cambiar el texto de un widget que se llama @EditLine1. Tendría esta pinta: </para>
<para>Hay una forma simplificada de usar &DCOP; desde dentro de &kommander;, usando la sintaxis del objeto. Digamos que quiere cambiar el texto de un widget que se llama @EditLine1. Tendría esta pinta: </para>
<para>Devuelve el valor de la variable global indicada. Cuando un guión se ejecuta desde la ventana de &kommander; cualquier variable (no global) definida en el guión dejará de existir una vez completado el guión y, por tanto, no estará disponible para otros procesos de guiones ni en nuevos ejemplares del proceso llamante. El <quote>ámbito</quote> global de la variable significa que existirá para cualquier proceso de la ventana hasta que se cierre la misma. Puede cambiar estas variables en cualquier momento con una nueva llamada a <function>@setGlobal</function>. </para>
<para>Devuelve el valor de la variable global indicada. Cuando un guión se ejecuta desde la ventana de &kommander; cualquier variable (no global) definida en el guión dejará de existir una vez completado el guión y, por tanto, no estará disponible para otros procesos de guiones ni en nuevos ejemplares del proceso llamante. El <quote>ámbito</quote> global de la variable significa que existirá para cualquier proceso de la ventana hasta que se cierre la misma. Puede cambiar estas variables en cualquier momento con una nueva llamada a <function>@setGlobal</function>. </para>
<para>Crea una variable global en el proceso de la ventana y le asigna un valor. Este valor se puede recuperar o volver a definir con global(QString nombreVariable). </para>
<para>Crea una variable global en el proceso de la ventana y le asigna un valor. Este valor se puede recuperar o volver a definir con global(TQString nombreVariable). </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString text)</term>
<term>changeWidgetText(TQString text)</term>
<listitem>
<listitem>
<para>Debería cambiar el nombre por setWidgetText y probablemente este nombre quede obsoleto. Elimina el texto que se muestra en el widget y lo reemplaza con el texto que se suministra. </para>
<para>Debería cambiar el nombre por setWidgetText y probablemente este nombre quede obsoleto. Elimina el texto que se muestra en el widget y lo reemplaza con el texto que se suministra. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString text)</term>
<term>setAssociatedText(TQString text)</term>
<listitem>
<listitem>
<para>Define la cadena predefinida de texto de &kommander;. Típicamente se define como <quote>@widgetText</quote> para mostrar lo que se introduzca en el widget. Posiblemente no lo necesite, pero ahí está por si acaso. Se aplica a todos los widgets que tengan datos. </para>
<para>Define la cadena predefinida de texto de &kommander;. Típicamente se define como <quote>@widgetText</quote> para mostrar lo que se introduzca en el widget. Posiblemente no lo necesite, pero ahí está por si acaso. Se aplica a todos los widgets que tengan datos. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>&DCOP; para widgets de listas de selección y de listas de selección múltiple</title>
<title>&DCOP; para widgets de listas de selección y de listas de selección múltiple</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString item, int index)</term>
<term>addListItem(TQString item, int index)</term>
<listitem>
<listitem>
<para>Añade un elemento a un widget de lista de selección en el índice (index) especificado. El índice de la lista comienza en el cero. Para añadirlo al final de la lista, use -1. </para>
<para>Añade un elemento a un widget de lista de selección en el índice (index) especificado. El índice de la lista comienza en el cero. Para añadirlo al final de la lista, use -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString item)</term>
<term>addUniqueItem(TQString item)</term>
<listitem>
<listitem>
<para>addUniqueItem añade un elemento (item) al final de la lista sólo si es único. </para>
<para>addUniqueItem añade un elemento (item) al final de la lista sólo si es único. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>&DCOP; para widgets de casilla de verificación y botones de radio</title>
<title>&DCOP; para widgets de casilla de verificación y botones de radio</title>
<listitem><para>Negatiivne ettevaade ei näita sobivust, kui otsitavale stringile järgnev osa ei vasta <emphasis>MUSTRILE</emphasis>.</para>
<listitem><para>Negatiivne ettevaade ei näita sobivust, kui otsitavale stringile järgnev osa ei vasta <emphasis>MUSTRILE</emphasis>.</para>
<para>Avaldisega <userinput>const \w+\b(?!\s*&)</userinput> sobib <quote>const char</quote> in the string <quote>const char* foo</quote>, aga mitte <quote>const QString</quote> stringis <quote>const QString& bar</quote>, sest <quote>&</quote> sobib negatiivse ettevaatava eelduse mustriga.</para>
<para>Avaldisega <userinput>const \w+\b(?!\s*&)</userinput> sobib <quote>const char</quote> in the string <quote>const char* foo</quote>, aga mitte <quote>const TQString</quote> stringis <quote>const TQString& bar</quote>, sest <quote>&</quote> sobib negatiivse ettevaatava eelduse mustriga.</para>
<listitem><para>Pluginaklassid peavad pakkuma <literal>staatilise</literal> funktsiooni <function>names</function>, mis tagastab nimede nimekirja, mida see saab välja kutsuda.</para></listitem>
<listitem><para>Pluginaklassid peavad pakkuma <literal>staatilise</literal> funktsiooni <function>names</function>, mis tagastab nimede nimekirja, mida see saab välja kutsuda.</para></listitem>
<listitem><para>Kui pluginat saab seadistada juhtimismoodulis, peab see seadistamiseks pakkuma <literal>ThemeEngineClass</literal>-põhise klassi.</para></listitem>
<listitem><para>Kui pluginat saab seadistada juhtimismoodulis, peab see seadistamiseks pakkuma <literal>ThemeEngineClass</literal>-põhise klassi.</para></listitem>
<listitem><para>Pluginaklassid peavad tühistama vähemalt ühe virtuaalsetest funktsioonidest <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> ja <function>slotUpdateSteps</function>, et see oleks kasutatav.</para></listitem>
<listitem><para>Pluginaklassid peavad tühistama vähemalt ühe virtuaalsetest funktsioonidest <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> ja <function>slotUpdateSteps</function>, et see oleks kasutatav.</para></listitem>
<listitem><para>Konstruktor peab olema kujul <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal>, et seda saaks kasutada koos klassiga <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Konstruktor peab olema kujul <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal>, et seda saaks kasutada koos klassiga <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>Viimane nõue võib tunduda keerukana, kuid hiljem näeme, et üheainsa rea lisamisega lähtefailidesse võib seda enamasti ignoreerida.</para>
<para>Viimane nõue võib tunduda keerukana, kuid hiljem näeme, et üheainsa rea lisamisega lähtefailidesse võib seda enamasti ignoreerida.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Analüüsime nüüd seda listingut. Klass <classname>Theme2k</classname> rahuldab nimekonventsiooni ja tema päritolu on <classname>ThemeEngine</classname>. Ta pakub <methodname>Theme2k::names()</methodname> ja tal on konstruktor, mis võtab soovitavad parameetrid <function>Theme2k( QWidget *, const char *, const QStringList& );</function> ning pakub ka lihtsa meetodi <methodname>Theme2k::slotSetText()</methodname>. Hetkel ei ole mõtet pead vaevata klassiga <classname>RotWidget</classname>. See on väike element, mis pakub kasutajale veidi silmailu. Meie plugin on äärmiselt lihtne ega näita mingeid ikoone või edenemisriba. Kui soovid ikoone näidata, tühista funktsioon <function>slotSetPixmap</function>. Sarnased funktsioonid on olemas edenemisriba vahemikule (<function>slotUpdateSteps</function>) ja käesoleva sammu kasvamisele (<function>slotUpdateProgress</function>). </para>
<para>Analüüsime nüüd seda listingut. Klass <classname>Theme2k</classname> rahuldab nimekonventsiooni ja tema päritolu on <classname>ThemeEngine</classname>. Ta pakub <methodname>Theme2k::names()</methodname> ja tal on konstruktor, mis võtab soovitavad parameetrid <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> ning pakub ka lihtsa meetodi <methodname>Theme2k::slotSetText()</methodname>. Hetkel ei ole mõtet pead vaevata klassiga <classname>RotWidget</classname>. See on väike element, mis pakub kasutajale veidi silmailu. Meie plugin on äärmiselt lihtne ega näita mingeid ikoone või edenemisriba. Kui soovid ikoone näidata, tühista funktsioon <function>slotSetPixmap</function>. Sarnased funktsioonid on olemas edenemisriba vahemikule (<function>slotUpdateSteps</function>) ja käesoleva sammu kasvamisele (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Plugina teostus</title>
<title>Plugina teostus</title>
@ -686,7 +686,7 @@ private:
<para>Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> on deklareeritud failis <filename>kgenericfactory.h</filename>. Edasi konstruktori kallale. Kuna see on väga lihtne plugin, on ka konstruktor lihtne ja selge.</para>
<para>Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> on deklareeritud failis <filename>kgenericfactory.h</filename>. Edasi konstruktori kallale. Kuna see on väga lihtne plugin, on ka konstruktor lihtne ja selge.</para>
<para>&kstars;i <abbrev>DCOP</abbrev> kiides kasutab järgmisi funktsioone: <itemizedlist>
<para>&kstars;i <abbrev>DCOP</abbrev> kiides kasutab järgmisi funktsioone: <itemizedlist>
<listitem><para><function> lookTowards( const QString suund )</function>: tsentreerib vaate argumendiga määratud punkti. Selleks võib olla suvalise taevakeha nimi või mõni järgmistest sõnadest või lühenditest: zenith (või z) seniidi tähistusena, north (n) põhjakaare, northeast (ne) kirde, east (e) ida, southeast (se) kagu, south (s), southwest (sw) edela, west (w) lääne ja northwest (nw) loode tähistusena. </para></listitem>
<listitem><para><function> lookTowards( const TQString suund )</function>: tsentreerib vaate argumendiga määratud punkti. Selleks võib olla suvalise taevakeha nimi või mõni järgmistest sõnadest või lühenditest: zenith (või z) seniidi tähistusena, north (n) põhjakaare, northeast (ne) kirde, east (e) ida, southeast (se) kagu, south (s), southwest (sw) edela, west (w) lääne ja northwest (nw) loode tähistusena. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: paus t sekundit enne järgneva skriptikäsu rakendamist. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: paus t sekundit enne järgneva skriptikäsu rakendamist. </para></listitem>
<listitem><para><function> waitForKey( const QString klahv )</function>: skripti rakendamine peatatakse, kuni kasutaja vajutab määratud klahvi. Praegu ei saa määrata klahvikombinatsioone (näiteks <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>), vaid ainult üksikklahve. Tühikuklahvi jaoks tuleb kirjutada <quote>space</quote>. </para></listitem>
<listitem><para><function> waitForKey( const TQString klahv )</function>: skripti rakendamine peatatakse, kuni kasutaja vajutab määratud klahvi. Praegu ei saa määrata klahvikombinatsioone (näiteks <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>), vaid ainult üksikklahve. Tühikuklahvi jaoks tuleb kirjutada <quote>space</quote>. </para></listitem>
<listitem><para><function> changeViewOption( const QString võimalus, const QString väärtus )</function>: vaatevõimaluse määramine. Kasutada saab kümneid võimalusi, sisuliselt kõike, mida saab seadistada &kstars;i <guilabel>vaateseadistuste aknas</guilabel>. Esimene argument ongi võimalus (vastav nimi võetakse seadistustefailist <filename>kstarsrc</filename>), teine soovitud väärtus. Argumentide parser on püütud teha võimalikult <quote>lollikindel</quote>, nii et kui kirjutad midagi kogemata valesti, siis see lihtsalt ei rakendu. </para></listitem>
<listitem><para><function> changeViewOption( const TQString võimalus, const TQString väärtus )</function>: vaatevõimaluse määramine. Kasutada saab kümneid võimalusi, sisuliselt kõike, mida saab seadistada &kstars;i <guilabel>vaateseadistuste aknas</guilabel>. Esimene argument ongi võimalus (vastav nimi võetakse seadistustefailist <filename>kstarsrc</filename>), teine soovitud väärtus. Argumentide parser on püütud teha võimalikult <quote>lollikindel</quote>, nii et kui kirjutad midagi kogemata valesti, siis see lihtsalt ei rakendu. </para></listitem>
<listitem><para><function> setGeoLocation( const QString linn, const QString provints/maakond, const QString riik )</function>: võimalus määrata vaatluskohaks mingi konkreetne linn. Kui argumendis määratud linna andmebaasist ei leita, ei tee see käsk midagi. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString linn, const TQString provints/maakond, const TQString riik )</function>: võimalus määrata vaatluskohaks mingi konkreetne linn. Kui argumendis määratud linna andmebaasist ei leita, ei tee see käsk midagi. </para></listitem>
<listitem><para><function>switchINDI(QString seadmeNimi, bool turnOn)</function> : INDI-seadme ühendamine või lahutamine.</para></listitem>
<listitem><para><function>switchINDI(TQString seadmeNimi, bool turnOn)</function> : INDI-seadme ühendamine või lahutamine.</para></listitem>
<listitem><para><function>setINDIPort(QString seadmeNimi, QString port)</function> : seadme ühenduse pordi määramine.</para></listitem>
<listitem><para><function>setINDIPort(TQString seadmeNimi, TQString port)</function> : seadme ühenduse pordi määramine.</para></listitem>
<listitem><para><function>setINDIAction(QString seadmeNimi, QString toiming)</function> : INDI-toimingu aktiveerimine. Toiming võib olla <emphasis>lülitamisomaduse</emphasis> mis tahes <emphasis>element</emphasis>.</para></listitem>
<listitem><para><function>setINDIAction(TQString seadmeNimi, TQString toiming)</function> : INDI-toimingu aktiveerimine. Toiming võib olla <emphasis>lülitamisomaduse</emphasis> mis tahes <emphasis>element</emphasis>.</para></listitem>
<listitem><para><function>waitForINDIAction(QString seadmeNimi, QString toiming)</function> : paus skripti täitmises, kuni määratud toimingu <emphasis>omadus</emphasis> tagastatakse OK-staatusega.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString seadmeNimi, TQString toiming)</function> : paus skripti täitmises, kuni määratud toimingu <emphasis>omadus</emphasis> tagastatakse OK-staatusega.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Teleskoobifunktsioonid: teleskoobi liikumist ja olekut kontrollivad funktsioonid.</para>
<listitem><para>Teleskoobifunktsioonid: teleskoobi liikumist ja olekut kontrollivad funktsioonid.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString seadmeNimi, QString toiming)</function> : teleskoobi režiimi või toimingu määramine. Võimalikud valikud on SLEW, TRACK, SYNC, PARK ja ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString seadmeNimi, TQString toiming)</function> : teleskoobi režiimi või toimingu määramine. Võimalikud valikud on SLEW, TRACK, SYNC, PARK ja ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString seadmeNimi, double otsetõus, double kääne)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>otsetõusule</emphasis> ja <emphasis>käändele</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString seadmeNimi, double otsetõus, double kääne)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>otsetõusule</emphasis> ja <emphasis>käändele</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString seadmeNimi, QString objektiNimi)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>objektiNime</emphasis> koordinaatidele. KStars otsib objekti nime oma andmebaasist ja hangib leidmise korral selle otsetõusu ja käände.</para></listitem>
<listitem><para><function>setINDITargetName(TQString seadmeNimi, TQString objektiNimi)</function> : määrab teleskoobi JNow sihtkoordinaadid <emphasis>objektiNime</emphasis> koordinaatidele. KStars otsib objekti nime oma andmebaasist ja hangib leidmise korral selle otsetõusu ja käände.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString seadmeNimi, double pikkuskraad, double laiuskraad)</function> : määrab teleskoobi geograafilise asukoha määratud pikkus- ja laiuskraadile. Pikkuskraadi arvestatakse Greenwichist (Suurbritannia) ida poole. Kuid kuigi läänepoolkera kohta kasutatakse sageli negatiivseid pikkuskraade, nõuab INDI, et pikkuskraad jääks 0 ja 360 vahele. See tähendab, et kui sul on kasutada negatiivne pikkuskraad, tuleb sellele liita 360 kraadi, et saada INDI-le sobilik väärtus. Näiteks Kanada linna Calgary koordinaadid &kstars;is on järgmised: pikkuskraad -114 04 58; laiuskraad 51 02 58. Nii on meie näite korral INDI pikkuskraad 360 - 114,093 = 245,917 kraadi.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString seadmeNimi, double pikkuskraad, double laiuskraad)</function> : määrab teleskoobi geograafilise asukoha määratud pikkus- ja laiuskraadile. Pikkuskraadi arvestatakse Greenwichist (Suurbritannia) ida poole. Kuid kuigi läänepoolkera kohta kasutatakse sageli negatiivseid pikkuskraade, nõuab INDI, et pikkuskraad jääks 0 ja 360 vahele. See tähendab, et kui sul on kasutada negatiivne pikkuskraad, tuleb sellele liita 360 kraadi, et saada INDI-le sobilik väärtus. Näiteks Kanada linna Calgary koordinaadid &kstars;is on järgmised: pikkuskraad -114 04 58; laiuskraad 51 02 58. Nii on meie näite korral INDI pikkuskraad 360 - 114,093 = 245,917 kraadi.</para></listitem>
<listitem><para><function>setINDIUTC(QString seadmeNimi, QString UTCDateTime)</function> : määrab teleskoobi UTC kuupäeva ja kellaaja ISO-8601 vormingus. Vorminguks on YYYY-MM-DDTHH:MM:SS (nt. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString seadmeNimi, TQString UTCDateTime)</function> : määrab teleskoobi UTC kuupäeva ja kellaaja ISO-8601 vormingus. Vorminguks on YYYY-MM-DDTHH:MM:SS (nt. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Kaamera/CCD funktsioonid: kaamera/CCD omaduste ja oleku kontrollimise funktsioonid.</para>
<listitem><para>Kaamera/CCD funktsioonid: kaamera/CCD omaduste ja oleku kontrollimise funktsioonid.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString seadmeNimi, int temp)</function> : määrab CCD-kiibi sihttemperatuuri Celsiuse kraadides.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString seadmeNimi, int temp)</function> : määrab CCD-kiibi sihttemperatuuri Celsiuse kraadides.</para></listitem>
<listitem><para><function>setINDIFrameType(QString seadmeNimi, QString tüüp)</function> : määrab CCD kaadritüübi. Võimalikud valikud on FRAME_LIGHT, FRAME_BIAS, FRAME_DARK ja FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString seadmeNimi, TQString tüüp)</function> : määrab CCD kaadritüübi. Võimalikud valikud on FRAME_LIGHT, FRAME_BIAS, FRAME_DARK ja FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString seadmeNimi, int aegumine)</function> : käivitab CCD/kaamera särituse sekunditeks, mille määrab <emphasis>aegumine</emphasis>.</para></listitem>
<listitem><para><function>startINDIExposure(TQString seadmeNimi, int aegumine)</function> : käivitab CCD/kaamera särituse sekunditeks, mille määrab <emphasis>aegumine</emphasis>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fokuseerija funktsioonid: fokuseerija liikumist ja olekut kontrollivad funktsioonid.</para>
<listitem><para>Fokuseerija funktsioonid: fokuseerija liikumist ja olekut kontrollivad funktsioonid.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString seadmeNimi, QString toiming)</function> : määrab fokuseerija kiiruse. Võimalikud valikud on FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM ja FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString seadmeNimi, TQString toiming)</function> : määrab fokuseerija kiiruse. Võimalikud valikud on FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM ja FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString seadmeNimi, int aegumine)</function> : määrab sekundites iga järgneva startINDIFocus operatsiooni kestuse.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString seadmeNimi, int aegumine)</function> : määrab sekundites iga järgneva startINDIFocus operatsiooni kestuse.</para></listitem>
<listitem><para><function>startINDIFocus(QString seadmeNimi, int fookuseSuund)</function> : liigutab fokuseerijat kas sissepoole (fookuseSuund = 0) või väljapoole (fookuseSuund = 1). Operatsiooni kiiruse ja kestuse saab määrata funktsioonidega <function>setINDIFocusSpeed()</function> ja <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString seadmeNimi, int fookuseSuund)</function> : liigutab fokuseerijat kas sissepoole (fookuseSuund = 0) või väljapoole (fookuseSuund = 1). Operatsiooni kiiruse ja kestuse saab määrata funktsioonidega <function>setINDIFocusSpeed()</function> ja <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Filtrifunktsioonid: filtri positsiooni kontrollivad funktsioonid.</para>
<listitem><para>Filtrifunktsioonid: filtri positsiooni kontrollivad funktsioonid.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString seadmeNimi, int filtri_number)</function>: annab filtrile positsiooni <varname>filtri_number</varname>. Viimaste aliaseid saab omistada dialoogis <guimenuitem>INDI seadistamine</guimenuitem>, mille saab avada menüüst <guimenu>Seadmed</guimenu> (nt. Filter 1 = punane, Filter 2 = roheline jne.).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString seadmeNimi, int filtri_number)</function>: annab filtrile positsiooni <varname>filtri_number</varname>. Viimaste aliaseid saab omistada dialoogis <guimenuitem>INDI seadistamine</guimenuitem>, mille saab avada menüüst <guimenu>Seadmed</guimenu> (nt. Filter 1 = punane, Filter 2 = roheline jne.).</para></listitem>
<para>Saadaolevate &DCOP;-liideste nimekirja õigete argumentide leidmiseks saab nii: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Saadaolevate &DCOP;-liideste nimekirja õigete argumentide leidmiseks saab nii: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
@ -1897,7 +1897,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Määrab näidatava teate taustavärvi. String võib olla kujul <quote>#RRGGBB</quote> (nagu tagastab <methodname>QColor::name()</methodname>), kus RR, GG ja BB on vastavalt punase, rohelise ja sinise kahekohalised kuueteistkümnendväärtused. String võib olla mõnel muul kujul, mida tunnustab <methodname>QColor::setNamedColor()</methodname>, näiteks X'i värvide andmebaasi nimi (⪚ <quote>red</quote> või <quote>steelblue</quote>). Kui string tühjaks jätta, kasutatakse parajasti vaikimisi kehtivat taustavärvi.</para>
<para>Määrab näidatava teate taustavärvi. String võib olla kujul <quote>#RRGGBB</quote> (nagu tagastab <methodname>TQColor::name()</methodname>), kus RR, GG ja BB on vastavalt punase, rohelise ja sinise kahekohalised kuueteistkümnendväärtused. String võib olla mõnel muul kujul, mida tunnustab <methodname>TQColor::setNamedColor()</methodname>, näiteks X'i värvide andmebaasi nimi (⪚ <quote>red</quote> või <quote>steelblue</quote>). Kui string tühjaks jätta, kasutatakse parajasti vaikimisi kehtivat taustavärvi.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -1999,21 +1999,21 @@ continuously in the background and alarms are always enabled.</para>
@ -2066,7 +2066,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bgColor</parameter></term>
<term><parameter>bgColor</parameter></term>
<listitem>
<listitem>
<para>Määrab näidatava faili taustavärvi. String võib olla kujul <quote>#RRGGBB</quote> (nagu tagastab <methodname>QColor::name()</methodname>), kus RR, GG ja BB on vastavalt punase, rohelise ja sinise kahekohalised kuueteistkümnendväärtused. String võib olla mõnel muul kujul, mida tunnustab <methodname>QColor::setNamedColor()</methodname>, näiteks X'i värvide andmebaasi nimi (⪚ <quote>red</quote> või <quote>steelblue</quote>). Kui string tühjaks jätta, kasutatakse parajasti vaikimisi kehtivat taustavärvi.</para>
<para>Määrab näidatava faili taustavärvi. String võib olla kujul <quote>#RRGGBB</quote> (nagu tagastab <methodname>TQColor::name()</methodname>), kus RR, GG ja BB on vastavalt punase, rohelise ja sinise kahekohalised kuueteistkümnendväärtused. String võib olla mõnel muul kujul, mida tunnustab <methodname>TQColor::setNamedColor()</methodname>, näiteks X'i värvide andmebaasi nimi (⪚ <quote>red</quote> või <quote>steelblue</quote>). Kui string tühjaks jätta, kasutatakse parajasti vaikimisi kehtivat taustavärvi.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2152,29 +2152,29 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>uue häire ajastamine, mis käivitab shellikäsu.</refpurpose>
<refpurpose>uue häire ajastamine, mis käivitab shellikäsu.</refpurpose>
<para><function>hastodo(QString taskname)</function> on &DCOP;-väljakutse, mis otsib etteantud nime. Leidmisel tagastatakse ülesannet tuvastav iCalendari UID. Mitteleidmisel tagastatakse tühi string. </para>
<para><function>hastodo(TQString taskname)</function> on &DCOP;-väljakutse, mis otsib etteantud nime. Leidmisel tagastatakse ülesannet tuvastav iCalendari UID. Mitteleidmisel tagastatakse tühi string. </para>
<para>Otsitakse iCalendari failis, mis on &karm;is parajasti avatud. Otsitakse läbi kõik ülesandepuud, mitte ainult tipptaseme ülesande. Kui nimega sobib enam kui üks ülesanne, tagastatakse esimesena leitu.</para>
<para>Otsitakse iCalendari failis, mis on &karm;is parajasti avatud. Otsitakse läbi kõik ülesandepuud, mitte ainult tipptaseme ülesande. Kui nimega sobib enam kui üks ülesanne, tagastatakse esimesena leitu.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -800,7 +800,7 @@ Trükitud: 2004-07-13 18:10
<refpurpose>Lisab uue ülesande.</refpurpose>
<refpurpose>Lisab uue ülesande.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString todoname)
<synopsis>TQString addtodo(TQString todoname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parameetrid</title>
<title>Parameetrid</title>
@ -817,7 +817,7 @@ Trükitud: 2004-07-13 18:10
<refsect1>
<refsect1>
<title>Kirjeldus</title>
<title>Kirjeldus</title>
<para><function>addtodo(QString todoname)</function> on &DCOP;-väljakutse, mis lisab aktiivsesse faili uue tipptaseme ülesande. Tagastatakse uue ülesande UID. </para>
<para><function>addtodo(TQString todoname)</function> on &DCOP;-väljakutse, mis lisab aktiivsesse faili uue tipptaseme ülesande. Tagastatakse uue ülesande UID. </para>
<para>Meie programmi teine objekt on nupp ehk klassi <classname>QPushButton</classname> eksemplar. Kahest eksemplari loomiseks mõeldud konstruktorist kasutame teist: see aktsepteerib teksti, mis on nupu sisu ehk antud juhul tekstistring "Hello world!" Seejärel kutsume välja meetodi <methodname>resize()</methodname>, et muuta nupu suurust vastavalt selle sisule - nupp peab olema suurem, et kogu string oleks näha. </para>
<para>Meie programmi teine objekt on nupp ehk klassi <classname>QPushButton</classname> eksemplar. Kahest eksemplari loomiseks mõeldud konstruktorist kasutame teist: see aktsepteerib teksti, mis on nupu sisu ehk antud juhul tekstistring "Hello world!" Seejärel kutsume välja meetodi <methodname>resize()</methodname>, et muuta nupu suurust vastavalt selle sisule - nupp peab olema suurem, et kogu string oleks näha. </para>
<para>Aga meetod <methodname>show()</methodname>? Siin näed, et nagu enamiku vidinate korral, tugineb <classname>QPushButton</classname> üheleainsale pärilusele ehk nagu ütleb dokumentatsioon: Inherits <classname>QButton</classname>. Klõpsa lingile <classname>QButton</classname>. Nüüd näed veel õige mitut vidinat, mis tuginevad klassile <classname>QButton</classname>, mida me kasutame hiljem signaali/pesa mehhanismi selgitamisel. Igal juhul ei ole siin kirjas meetodit <methodname>show()</methodname>, mis tähendab, et ka selle peab tagama pärilus. Klass, mille järglane on <classname>QButton</classname>, kannab nime <classname>QWidget</classname>. Klõpsa taas lingile ja näed tervet rida meetodeid,mida pakub klass QWidget. Nende hulka kuulub ka meetod <methodname>show()</methodname>. Nüüd on võimalik mõista, mida meie näidises nupuga ette võetakse: <orderedlist>
<para>Aga meetod <methodname>show()</methodname>? Siin näed, et nagu enamiku vidinate korral, tugineb <classname>QPushButton</classname> üheleainsale pärilusele ehk nagu ütleb dokumentatsioon: Inherits <classname>QButton</classname>. Klõpsa lingile <classname>QButton</classname>. Nüüd näed veel õige mitut vidinat, mis tuginevad klassile <classname>QButton</classname>, mida me kasutame hiljem signaali/pesa mehhanismi selgitamisel. Igal juhul ei ole siin kirjas meetodit <methodname>show()</methodname>, mis tähendab, et ka selle peab tagama pärilus. Klass, mille järglane on <classname>QButton</classname>, kannab nime <classname>TQWidget</classname>. Klõpsa taas lingile ja näed tervet rida meetodeid,mida pakub klass TQWidget. Nende hulka kuulub ka meetod <methodname>show()</methodname>. Nüüd on võimalik mõista, mida meie näidises nupuga ette võetakse: <orderedlist>
<listitem><para>Luuakse <classname>QPushButton</classname> eksemplar, kasutades teist konstruktorit nupu teksti määramiseks</para></listitem>
<listitem><para>Luuakse <classname>QPushButton</classname> eksemplar, kasutades teist konstruktorit nupu teksti määramiseks</para></listitem>
<listitem><para>Muudetakse vidina suurust sisu mahutamiseks</para></listitem>
<listitem><para>Muudetakse vidina suurust sisu mahutamiseks</para></listitem>
<listitem><para>Määratakse vidin <classname>QApplication</classname> eksemplari a põhividinaks</para></listitem>
<listitem><para>Määratakse vidin <classname>QApplication</classname> eksemplari a põhividinaks</para></listitem>
<listitem><para>Antakse vidinale korraldus näidata ennast ekraanil, kutsudes välja meetodi <methodname>show()</methodname>, mis on klassi <classname>QWidget</classname> järglane</para></listitem>
<listitem><para>Antakse vidinale korraldus näidata ennast ekraanil, kutsudes välja meetodi <methodname>show()</methodname>, mis on klassi <classname>TQWidget</classname> järglane</para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Pärast meetodi <methodname>exec()</methodname> väljakutsumist on rakendus kasutajale nähtav: aken nupuga, millel on kiri "Hello world!" Märkus: GUI programmid käituvad mõnikord veidi teistmoodi protseduurrakendused. Peamiseks erinevuseks on asjaolu, et rakendus siseneb niinimetatud "põhisilmusesse". See tähendab, et programm peab ootama kasutaja tegevust ja seejärel sellele reageerima, samuti seda, et Qt rakenduse korral peab programm olema põhisilmuses, enne kui saab alustada sündmuste käsitlemist. Järgmises osas räägime lühidalt, mida see tähendab programmeerijale ja mida pakub Qt kasutaja sündmuste töötlemiseks. </para>
<para>Pärast meetodi <methodname>exec()</methodname> väljakutsumist on rakendus kasutajale nähtav: aken nupuga, millel on kiri "Hello world!" Märkus: GUI programmid käituvad mõnikord veidi teistmoodi protseduurrakendused. Peamiseks erinevuseks on asjaolu, et rakendus siseneb niinimetatud "põhisilmusesse". See tähendab, et programm peab ootama kasutaja tegevust ja seejärel sellele reageerima, samuti seda, et Qt rakenduse korral peab programm olema põhisilmuses, enne kui saab alustada sündmuste käsitlemist. Järgmises osas räägime lühidalt, mida see tähendab programmeerijale ja mida pakub Qt kasutaja sündmuste töötlemiseks. </para>
<note><para>Juba kogemustega kasutajatele: konstruktoris pole deklareeritud nupu eellast, seepärast on see tipptaseme vidin, mis töötab kohalikus silmuses, mistõttu ei pea ootama põhisilmust. Vaata klassi QWidget ja KDE teegi dokumentatsiooni.</para>
<note><para>Juba kogemustega kasutajatele: konstruktoris pole deklareeritud nupu eellast, seepärast on see tipptaseme vidin, mis töötab kohalikus silmuses, mistõttu ei pea ootama põhisilmust. Vaata klassi TQWidget ja KDE teegi dokumentatsiooni.</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Nüüd äratame oma rakenduse "ellu" kasutaja sündmusi töötlema asudes. Üldiselt on kasutajal kaks võimalust programmiga suhelda: hiir ja klaviatuur. Mõlemal juhul peab graafiline kasutajaliides pakkuma meetodeid, mis tuvastavad toimingud, ja meetodeid, mis neile toimingutele reageerides midagi ette võtavad. </para>
<para>Nüüd äratame oma rakenduse "ellu" kasutaja sündmusi töötlema asudes. Üldiselt on kasutajal kaks võimalust programmiga suhelda: hiir ja klaviatuur. Mõlemal juhul peab graafiline kasutajaliides pakkuma meetodeid, mis tuvastavad toimingud, ja meetodeid, mis neile toimingutele reageerides midagi ette võtavad. </para>
<para>X Window saadab kõik interaktsioonisündmused vastavale rakendusele. <classname>QApplication</classname> saadab need siis aktiivsele aknale klassina <classname>QEvent</classname>, misjärel vidinad peavad otsustama, mida nendega peale hakata. Vidin saab sündmuse ja töötleb meetodit <methodname>QWidget::event(QEvent*)</methodname>, mis otsustab, milline sündmus käivitati ja kuidas reageerida: niisiis on peamine sündmuste käsitleja <methodname>event()</methodname>. Nüüd suunab <methodname>event()</methodname> sündmuse niinimetatud sündmusefiltrisse, mis määrab, mis toimus ja mida sündmusega peale hakata. Kui ükski filter antud sündmusega ei tegele, kutsutakse välja spetsialiseeritud sündmuste käsitlejad. Need on järgmised: <itemizedlist>
<para>X Window saadab kõik interaktsioonisündmused vastavale rakendusele. <classname>QApplication</classname> saadab need siis aktiivsele aknale klassina <classname>QEvent</classname>, misjärel vidinad peavad otsustama, mida nendega peale hakata. Vidin saab sündmuse ja töötleb meetodit <methodname>TQWidget::event(QEvent*)</methodname>, mis otsustab, milline sündmus käivitati ja kuidas reageerida: niisiis on peamine sündmuste käsitleja <methodname>event()</methodname>. Nüüd suunab <methodname>event()</methodname> sündmuse niinimetatud sündmusefiltrisse, mis määrab, mis toimus ja mida sündmusega peale hakata. Kui ükski filter antud sündmusega ei tegele, kutsutakse välja spetsialiseeritud sündmuste käsitlejad. Need on järgmised: <itemizedlist>
<listitem><para>Klaviatuurisündmused - klahvid TAB ja Shift:</para>
<listitem><para>Klaviatuurisündmused - klahvid TAB ja Shift:</para>
<para>Pane tähele, et kõik sündmuse funktsioonid on virtuaalsed ja kaitstud. Seepärast saad taasteostada sündmusi, mida vajad omaenda vidinates, ja määrata, kuidas vidin peab reageerima. <classname>QWidget</classname> sisaldab ka mõningaid virtuaalseid meetodeid, mis võivad sinu programmis kasuks tulla. Nii või teisiti on äärmiselt tulus klassi <classname>QWidget</classname> hästi tundma õppida. </para>
<para>Pane tähele, et kõik sündmuse funktsioonid on virtuaalsed ja kaitstud. Seepärast saad taasteostada sündmusi, mida vajad omaenda vidinates, ja määrata, kuidas vidin peab reageerima. <classname>TQWidget</classname> sisaldab ka mõningaid virtuaalseid meetodeid, mis võivad sinu programmis kasuks tulla. Nii või teisiti on äärmiselt tulus klassi <classname>TQWidget</classname> hästi tundma õppida. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Objekti interaktsioon signaalide ja pesadega</title>
<title>Objekti interaktsioon signaalide ja pesadega</title>
<para>Nüüd jõuame Qt tööriistakomplekti kõige suurema eelise juurde, milleks on signaalide/pesade mehhanism. See pakub väga käepärase ja tulusa lahenduse objektide interaktsioonile, mis X Window tööriistakomplektides lahendatakse tavaliselt tagasikutsete (callback) funktsioonidega. Et selline kommunikatsioon eeldab väga ranget programmeerimist ning muudab mõnikord kasutajaliidese loomise üpris keerukaks (seda tutvustab ka Qt dokumentatsioon ning selgitab põhjalikult K. Dalheimeri raamat 'Programming with Qt'), leiutas Trolltech uue süsteemi, milles objektid emiteerivad signaale, mida saab siduda pesadena (slot) deklareeritud meetoditega. C++ programmeerija peab sellest teadma põhimõtteliselt vaid mõnda asja: <itemizedlist>
<para>Nüüd jõuame Qt tööriistakomplekti kõige suurema eelise juurde, milleks on signaalide/pesade mehhanism. See pakub väga käepärase ja tulusa lahenduse objektide interaktsioonile, mis X Window tööriistakomplektides lahendatakse tavaliselt tagasikutsete (callback) funktsioonidega. Et selline kommunikatsioon eeldab väga ranget programmeerimist ning muudab mõnikord kasutajaliidese loomise üpris keerukaks (seda tutvustab ka Qt dokumentatsioon ning selgitab põhjalikult K. Dalheimeri raamat 'Programming with Qt'), leiutas Trolltech uue süsteemi, milles objektid emiteerivad signaale, mida saab siduda pesadena (slot) deklareeritud meetoditega. C++ programmeerija peab sellest teadma põhimõtteliselt vaid mõnda asja: <itemizedlist>
<listitem><para>signaale/pesasid kasutava klassi deklaratsiooni alguses peab seisma makro TQ_OBJECT (ilma semikoolonita) ja see peab olema tuletatud klassist <classname>QObject</classname> </para></listitem>
<listitem><para>signaale/pesasid kasutava klassi deklaratsiooni alguses peab seisma makro TQ_OBJECT (ilma semikoolonita) ja see peab olema tuletatud klassist <classname>TQObject</classname> </para></listitem>
<listitem><para>signaali võib emiteerida võtmesõna emit, nt. emit signaal(parameetrid), mis tahes klassi liikmesfunktsioonist, mis võimaldab signaale/pesasid </para></listitem>
<listitem><para>signaali võib emiteerida võtmesõna emit, nt. emit signaal(parameetrid), mis tahes klassi liikmesfunktsioonist, mis võimaldab signaale/pesasid </para></listitem>
<listitem><para>kõik signaalid, mida kasutavad klassid, mis ei ole päritud, tuleb lisada klassi deklaratsiooni signaalide sektsiooni </para></listitem>
<listitem><para>kõik signaalid, mida kasutavad klassid, mis ei ole päritud, tuleb lisada klassi deklaratsiooni signaalide sektsiooni </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>metaobjekti kompilaator moc peab töötlema päisefaili, et laiendada makrod ja luua teostus (mida pole tingimata vaja teadagi). moc'i väljundfailid kompileerib samuti C++ kompilaator. </para></listitem>
<listitem><para>metaobjekti kompilaator moc peab töötlema päisefaili, et laiendada makrod ja luua teostus (mida pole tingimata vaja teadagi). moc'i väljundfailid kompileerib samuti C++ kompilaator. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Veel üks viis kasutada signaale ilma klassist <classname>QObject</classname> tuletamata näeb ette klassi <classname>QSignal</classname> kasutamist. Uuri dokumentatsioonist ise täpsemalt, kuidas seda kasutada. Järgnevalt eeldame, et tuletatud on klassist <classname>QObject</classname>. </para>
<para>Veel üks viis kasutada signaale ilma klassist <classname>TQObject</classname> tuletamata näeb ette klassi <classname>QSignal</classname> kasutamist. Uuri dokumentatsioonist ise täpsemalt, kuidas seda kasutada. Järgnevalt eeldame, et tuletatud on klassist <classname>TQObject</classname>. </para>
<para>Nii võib sinu klass saata kõikjale signaale ja pakkuda pesasid, millega signaalid saavad ühenduse luua. Signaale kasutades ei pruugi muretseda, kes neid saab: sa lihtsalt emiteerid signaali, millele reageerib see pesa, millega sa soovid signaali ühendada. Pesasid võib samas kasutada teostuse ajal tavaliste meetoditena. </para>
<para>Nii võib sinu klass saata kõikjale signaale ja pakkuda pesasid, millega signaalid saavad ühenduse luua. Signaale kasutades ei pruugi muretseda, kes neid saab: sa lihtsalt emiteerid signaali, millele reageerib see pesa, millega sa soovid signaali ühendada. Pesasid võib samas kasutada teostuse ajal tavaliste meetoditena. </para>
<para>Signaali ühendamiseks pesaga tuleb kasutada meetodit <methodname>connect()</methodname>, mida pakub <classname>QObject</classname>, või olemasolu korral spetsiaalseid meetodeid, mida objektid pakuvad ühenduse võimaldamiseks teatud signaalidega. </para>
<para>Signaali ühendamiseks pesaga tuleb kasutada meetodit <methodname>connect()</methodname>, mida pakub <classname>TQObject</classname>, või olemasolu korral spetsiaalseid meetodeid, mida objektid pakuvad ühenduse võimaldamiseks teatud signaalidega. </para>
<para>Nagu näed, saab üheainsa lisandusega anda nupule suurema interaktiivsuse. Selleks on vaja ainult lisada meetod <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>. Mida see tähendab? Klassi QObject deklaratsioon ütleb meetodi <methodname>connect()</methodname> kohta järgmist: </para>
<para>Nagu näed, saab üheainsa lisandusega anda nupule suurema interaktiivsuse. Selleks on vaja ainult lisada meetod <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>. Mida see tähendab? Klassi TQObject deklaratsioon ütleb meetodi <methodname>connect()</methodname> kohta järgmist: </para>
<para>See tähendab, et sul tuleb määrata <classname>QObject</classname> eksemplari viit, mis on signaali saatja, mis tähendab, et sa emiteerid selle signaali esimese parameetrina. Seejärel tuleb määrata signaal, millega soovid ühenduse luua. Viimased kaks parameetrit on vastuvõttev objekt, mis pakub pesa, ning sellele järgneb liikmesfunktsioon, mis ongi tegelik pesa, mis käivitatakse signaali emiteerimisel. </para>
<para>See tähendab, et sul tuleb määrata <classname>TQObject</classname> eksemplari viit, mis on signaali saatja, mis tähendab, et sa emiteerid selle signaali esimese parameetrina. Seejärel tuleb määrata signaal, millega soovid ühenduse luua. Viimased kaks parameetrit on vastuvõttev objekt, mis pakub pesa, ning sellele järgneb liikmesfunktsioon, mis ongi tegelik pesa, mis käivitatakse signaali emiteerimisel. </para>
<para>Signaalide ja pesade abil saavad sinu programmi objektid üksteisega suhelda ilma vajaduseta otseselt sõltuda vastuvõtva objekti tüübist. Selle mehhanismi kasutamisest tuleb käsiraamatus veel pikemalt juttu. Rohkem infot signaalide ja pesade mehhanismi kohta leiab ka <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE teegi</ulink> ja <ulink url="doc.trolltech.com">Qt dokumentatsioonist</ulink>. </para>
<para>Signaalide ja pesade abil saavad sinu programmi objektid üksteisega suhelda ilma vajaduseta otseselt sõltuda vastuvõtva objekti tüübist. Selle mehhanismi kasutamisest tuleb käsiraamatus veel pikemalt juttu. Rohkem infot signaalide ja pesade mehhanismi kohta leiab ka <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE teegi</ulink> ja <ulink url="doc.trolltech.com">Qt dokumentatsioonist</ulink>. </para>
<para>Kõigepealt asendasime klassi <classname>QApplication</classname> klassiga <classname>TDEApplication</classname>. Seejärel pidime muutma varasema meetodi <methodname>setMainWidget()</methodname> meetodiks <methodname>setTopWidget</methodname>, mida <classname>TDEApplication</classname> kasutab põhividina määramiseks. Ja ongi kõik! Sinu esimene KDE rakendus on valmis - pead veel ainult kompilaatorile teatama KDE kaasamise asukohta ja linkuriga linkima teegi tdecore võtmega -ltdecore. </para>
<para>Kõigepealt asendasime klassi <classname>QApplication</classname> klassiga <classname>TDEApplication</classname>. Seejärel pidime muutma varasema meetodi <methodname>setMainWidget()</methodname> meetodiks <methodname>setTopWidget</methodname>, mida <classname>TDEApplication</classname> kasutab põhividina määramiseks. Ja ongi kõik! Sinu esimene KDE rakendus on valmis - pead veel ainult kompilaatorile teatama KDE kaasamise asukohta ja linkuriga linkima teegi tdecore võtmega -ltdecore. </para>
<para>Nüüd, kus tead, mida funktsioon <function>main()</function> üldiselt pakub ja kuidas muuta rakendus nähtavaks ning võimaldada kasutaja ja objekti interaktsiooni, on aeg minna järgmise peatüki kallale, kus loome oma esimese rakenduse &tdevelop;iga. Samuti saab seal testida kõike, millest oleme juttu teinud, ning näha oma silmaga, mis kuidas toimib. </para>
<para>Nüüd, kus tead, mida funktsioon <function>main()</function> üldiselt pakub ja kuidas muuta rakendus nähtavaks ning võimaldada kasutaja ja objekti interaktsiooni, on aeg minna järgmise peatüki kallale, kus loome oma esimese rakenduse &tdevelop;iga. Samuti saab seal testida kõike, millest oleme juttu teinud, ning näha oma silmaga, mis kuidas toimib. </para>
<para>Usutavasti oled järginud juhiseid ning uurinud Qt dokumentatsiooni, eriti just klasside <classname>QApplication</classname>, <classname>QWidget</classname> ja <classname>QObject</classname> kohta, ning teegi tdecore dokumentatsiooni klassi <classname>TDEApplication</classname> kohta. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE teegi käsiraamat</ulink> sisaldab samuti põhjalikku kirjeldust konstruktorite <classname>QApplication</classname> ja <classname>TDEApplication</classname> väljakutsumise kohta, kaasa arvatud käsureaargumentide töötlemine. </para>
<para>Usutavasti oled järginud juhiseid ning uurinud Qt dokumentatsiooni, eriti just klasside <classname>QApplication</classname>, <classname>TQWidget</classname> ja <classname>TQObject</classname> kohta, ning teegi tdecore dokumentatsiooni klassi <classname>TDEApplication</classname> kohta. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE teegi käsiraamat</ulink> sisaldab samuti põhjalikku kirjeldust konstruktorite <classname>QApplication</classname> ja <classname>TDEApplication</classname> väljakutsumise kohta, kaasa arvatud käsureaargumentide töötlemine. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // allow the view to change the statusbar and caption
18 // allow the view to change the statusbar and caption
<para>Ja ei pruugi mainidagi, et kujunduse üks peamisi sihte on stabiilsus. Vigu ei ole muidugi võimalik kunagi täielikult vältida, kuid oskuslikult seatud kujunduseesmärkide ja objektorienteeritud disaini agara kasutamisega võib saavutada väga palju. C++ muudab programmeerimise lõbuks, kui oskad ära kasutada selle võimalusi: pärilus, info peitmine, juba olemasoleva koodi korduvkasutus. </para>
<para>Ja ei pruugi mainidagi, et kujunduse üks peamisi sihte on stabiilsus. Vigu ei ole muidugi võimalik kunagi täielikult vältida, kuid oskuslikult seatud kujunduseesmärkide ja objektorienteeritud disaini agara kasutamisega võib saavutada väga palju. C++ muudab programmeerimise lõbuks, kui oskad ära kasutada selle võimalusi: pärilus, info peitmine, juba olemasoleva koodi korduvkasutus. </para>
<para>KDE või Qt projekti luues peab sul alati olema vaade, mis on klassi QWidget järglane kas otsese päriluse kaudu või siis teegividina kaudu, mida soovid tarvitada. Seepärast konstrueerib juba Rakenduse nõustaja vaate, mis on klassi sinurakendusView eksemplar ja klassi QWidget järglane. </para>
<para>KDE või Qt projekti luues peab sul alati olema vaade, mis on klassi TQWidget järglane kas otsese päriluse kaudu või siis teegividina kaudu, mida soovid tarvitada. Seepärast konstrueerib juba Rakenduse nõustaja vaate, mis on klassi sinurakendusView eksemplar ja klassi TQWidget järglane. </para>
<para>See peatükk kirjeldabki, kuidas kasutada teegividinaid &tdevelop;is loodud KDE või Qt rakenduste vaadete loomiseks, seejärel aga vaatame teeke ja vaateid, mida nad pakuvad. </para>
<para>See peatükk kirjeldabki, kuidas kasutada teegividinaid &tdevelop;is loodud KDE või Qt rakenduste vaadete loomiseks, seejärel aga vaatame teeke ja vaateid, mida nad pakuvad. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>Qt võrgudokumentatsiooni avaleheküljelt leiab lingi "Widget Screenshots", millele klõpsates saab näha, kuidas näevad välja Qt pakutavad vidinad. Neid saab otsekohe kasutada ning kombineerida keerukamate vidinate loomiseks, mille alusel luua rakenduste vaateid või dialooge. Järgnevalt vaatleme mõningaid vidinaid, mida saab edukalt ära kasutada rakenduste vaadete loomiseks, kuid tasub meeles pidada, et ka KDE teegid sisaldavad vidinaid, mida saab samaks otstarbeks pruukida. Neist tuleb juttu järgmises osas. </para>
<para>Qt võrgudokumentatsiooni avaleheküljelt leiab lingi "Widget Screenshots", millele klõpsates saab näha, kuidas näevad välja Qt pakutavad vidinad. Neid saab otsekohe kasutada ning kombineerida keerukamate vidinate loomiseks, mille alusel luua rakenduste vaateid või dialooge. Järgnevalt vaatleme mõningaid vidinaid, mida saab edukalt ära kasutada rakenduste vaadete loomiseks, kuid tasub meeles pidada, et ka KDE teegid sisaldavad vidinaid, mida saab samaks otstarbeks pruukida. Neist tuleb juttu järgmises osas. </para>
<para>Anname mõned nõuanded, milliseid Qt komponente milleks kasutada: <orderedlist>
<para>Anname mõned nõuanded, milliseid Qt komponente milleks kasutada: <orderedlist>
<listitem><para>Kui sinu vaade pole piisavalt suur kõigi andmete näitamiseks, peab kasutajal olema võimalus kerida dokumenti vaate vasakus ja alumises servas asuvate ribadega. Selleks pakub Qt klassi <classname>QScrollView</classname>, mis tekitab keritava alampiirkonna. Nagu juba mainitud, tuleb oma vidin muuta <classname>QScrollView</classname> järglaseks või kasutada eksemplari oma dokumendi vaatevidina haldamiseks. </para></listitem>
<listitem><para>Kui sinu vaade pole piisavalt suur kõigi andmete näitamiseks, peab kasutajal olema võimalus kerida dokumenti vaate vasakus ja alumises servas asuvate ribadega. Selleks pakub Qt klassi <classname>QScrollView</classname>, mis tekitab keritava alampiirkonna. Nagu juba mainitud, tuleb oma vidin muuta <classname>QScrollView</classname> järglaseks või kasutada eksemplari oma dokumendi vaatevidina haldamiseks. </para></listitem>
<listitem><para>Et luua ise kerimisvaade, muuda vidin View klassi <classname>QWidget</classname> järglaseks ja lisa püstine ja rõhtne <classname>QScrollBars</classname> (seda teeb teha KDE vidinaga TDEHTMLView). </para></listitem>
<listitem><para>Et luua ise kerimisvaade, muuda vidin View klassi <classname>TQWidget</classname> järglaseks ja lisa püstine ja rõhtne <classname>QScrollBars</classname> (seda teeb teha KDE vidinaga TDEHTMLView). </para></listitem>
<listitem><para>Tekstitöötluseks kasuta klassi <classname>QTextEdit</classname>. See pakub täieliku tekstiredaktori vidina, mis suudab juba teksti lõigata, kopeerida ja asetada ning mida haldab kerimisvaade. </para></listitem>
<listitem><para>Tekstitöötluseks kasuta klassi <classname>QTextEdit</classname>. See pakub täieliku tekstiredaktori vidina, mis suudab juba teksti lõigata, kopeerida ja asetada ning mida haldab kerimisvaade. </para></listitem>
<listitem><para>Tabelisse paigutatud andmete esitamiseks kasuta klassi <classname>QTable</classname>. Et ka klassi <classname>QTable</classname> haldab kerimisvaade, sobib see hästi tabelitöötlusrakendustele. </para></listitem>
<listitem><para>Tabelisse paigutatud andmete esitamiseks kasuta klassi <classname>QTable</classname>. Et ka klassi <classname>QTable</classname> haldab kerimisvaade, sobib see hästi tabelitöötlusrakendustele. </para></listitem>
<listitem><para>Kahe erineva vidina või vidina eksemplari näitamiseks ühel ja samal ajal kasuta klassi <classname>QSplitter</classname>. See võimaldab paanida vaateid rõhtsate või püstiste eraldajate abil. Selle heaks näiteks on KMail: peavaade on eraldajaga jagatud vertikaalselt, parempoolne aken aga omakorda rõhtsalt. </para></listitem>
<listitem><para>Kahe erineva vidina või vidina eksemplari näitamiseks ühel ja samal ajal kasuta klassi <classname>QSplitter</classname>. See võimaldab paanida vaateid rõhtsate või püstiste eraldajate abil. Selle heaks näiteks on KMail: peavaade on eraldajaga jagatud vertikaalselt, parempoolne aken aga omakorda rõhtsalt. </para></listitem>
@ -653,7 +653,7 @@ return a.exec();
<title>Kiirklahvide seadistamine</title>
<title>Kiirklahvide seadistamine</title>
<para>Rakendusele annab märksa professionaalsema ilme, kui lisad sellele kiirklahvid. Neid tarvitavad küll peamiselt kogenumad kasutajad, kes soovivad rakenduses tavapärasest veelgi kiiremini töötada ega pelga selleks väikest vaeva kiirklahvide meeldejätmise nimel. Selleks pakuvad KDE teegid klassi <classname>TDEAction</classname>, mis pakub kiirklahve ja ligipääsu globaalselt seadistatud standardsetele kiirklahvidele. </para>
<para>Rakendusele annab märksa professionaalsema ilme, kui lisad sellele kiirklahvid. Neid tarvitavad küll peamiselt kogenumad kasutajad, kes soovivad rakenduses tavapärasest veelgi kiiremini töötada ega pelga selleks väikest vaeva kiirklahvide meeldejätmise nimel. Selleks pakuvad KDE teegid klassi <classname>TDEAction</classname>, mis pakub kiirklahve ja ligipääsu globaalselt seadistatud standardsetele kiirklahvidele. </para>
<para>Vaikimisi kasutavad &tdevelop;i genereeritud rakenduse raamistikud ainult standardseid kiirklahve, näiteks F1 abidokumendi avamiseks, Ctrl+N uue faili loomiseks jne. </para>
<para>Vaikimisi kasutavad &tdevelop;i genereeritud rakenduse raamistikud ainult standardseid kiirklahve, näiteks F1 abidokumendi avamiseks, Ctrl+N uue faili loomiseks jne. </para>
<para>Kui sinu rakenduses on hulk kiirklahve, tuleb need muuta seadistatavaks menüüsse Seadistused lisatava eraldi kirjega või vähemalt koos teiste rakenduste seadistustega dialoogis, mida pakub QWidget. KDE teek pakubki klassi <classname>KKeyChooser</classname> kaardidialoogide jaoks ning klassi <classname>KKeyDialog</classname> kiirklahvide seadistamise dialoogile. </para>
<para>Kui sinu rakenduses on hulk kiirklahve, tuleb need muuta seadistatavaks menüüsse Seadistused lisatava eraldi kirjega või vähemalt koos teiste rakenduste seadistustega dialoogis, mida pakub TQWidget. KDE teek pakubki klassi <classname>KKeyChooser</classname> kaardidialoogide jaoks ning klassi <classname>KKeyDialog</classname> kiirklahvide seadistamise dialoogile. </para>
</sect1>
</sect1>
</chapter>
</chapter>
@ -696,7 +696,7 @@ return a.exec();
<sect1 id="c8s4">
<sect1 id="c8s4">
<title><guibutton>Mis see on?</guibutton> nupp</title>
<title><guibutton>Mis see on?</guibutton> nupp</title>
<para>Nupp <guibutton>Mis see on?</guibutton> palub abiakna, mis näitab kasutajale soovi korral abi teatud vidina kohta töövaates või tööriistaribal. See asub tööriistaribal ja aktiveerub, kui kasutaja nupule klõpsab. Kursor võtab küsimärgiga noole kuju, sarnanedes sel moel nupu enda ikoonile. Kasutaja saab sellega klõpsata huvipakkuva vidina peale, mis avabki abiakna. Võid näiteks katsetada, mida teeb nupp <guibutton>Mis see on?</guibutton> &tdevelop;is. </para>
<para>Nupp <guibutton>Mis see on?</guibutton> palub abiakna, mis näitab kasutajale soovi korral abi teatud vidina kohta töövaates või tööriistaribal. See asub tööriistaribal ja aktiveerub, kui kasutaja nupule klõpsab. Kursor võtab küsimärgiga noole kuju, sarnanedes sel moel nupu enda ikoonile. Kasutaja saab sellega klõpsata huvipakkuva vidina peale, mis avabki abiakna. Võid näiteks katsetada, mida teeb nupp <guibutton>Mis see on?</guibutton> &tdevelop;is. </para>
<para>Mis see on? abi lisamiseks vidinale tuleb kasutada staatilist meetodit <methodname>QWhatsThis::add(QWidget *widget, const QString &text)</methodname> </para>
<para>Mis see on? abi lisamiseks vidinale tuleb kasutada staatilist meetodit <methodname>QWhatsThis::add(TQWidget *widget, const TQString &text)</methodname> </para>
<para>Qt süvataseme pildiloome tugineb neile X11 ja muude aknasüsteemide võimetele, mille jaoks on olemas Qt pordid. Kuid see ka laiendab neid, teostades täiendavaid võimalusi, näiteks teksti ja pikselrastrite afiinsed transformatsioonid. </para>
<para>Qt süvataseme pildiloome tugineb neile X11 ja muude aknasüsteemide võimetele, mille jaoks on olemas Qt pordid. Kuid see ka laiendab neid, teostades täiendavaid võimalusi, näiteks teksti ja pikselrastrite afiinsed transformatsioonid. </para>
<para>Qt 2D joonistamise keskne graafikaklass on <ulink url="kdeapi:qt/QPainter"></ulink>. Selle aluseks on <ulink url="kdeapi:qt/QPaintDevice"></ulink>. Teostatud on kolm võimalikku joonistamisseadet. <ulink url="kdeapi:qt/QWidget"></ulink> esindab vidinat ekraanil. <ulink url="kdeapi:qt/QPrinter"></ulink> esindab printerit ja loob PostScript väljundi. <ulink url="kdeapi:qt/QPicture"></ulink> tuvastab joonistamiskäsud ja võib salvestada need kettale ning neid hiljem taasesitada. Joonistamiskäskude võimalik salvestusvorming on W3C standard SVG. </para>
<para>Qt 2D joonistamise keskne graafikaklass on <ulink url="kdeapi:qt/QPainter"></ulink>. Selle aluseks on <ulink url="kdeapi:qt/QPaintDevice"></ulink>. Teostatud on kolm võimalikku joonistamisseadet. <ulink url="kdeapi:qt/TQWidget"></ulink> esindab vidinat ekraanil. <ulink url="kdeapi:qt/QPrinter"></ulink> esindab printerit ja loob PostScript väljundi. <ulink url="kdeapi:qt/QPicture"></ulink> tuvastab joonistamiskäsud ja võib salvestada need kettale ning neid hiljem taasesitada. Joonistamiskäskude võimalik salvestusvorming on W3C standard SVG. </para>
<para>Nii on võimalik renderduskoodi, mida kasutad vidina näitamiseks, pruukida ka trükkimiseks, kusjuures toetatud on samasugused võimalused. Praktikas kasutatakse koodi mõistagi veidi erinevas kontekstis. Vidina kujutamine tehakse peaaegu eranditult vidinaklassi meetodiga paintEvent(). </para>
<para>Nii on võimalik renderduskoodi, mida kasutad vidina näitamiseks, pruukida ka trükkimiseks, kusjuures toetatud on samasugused võimalused. Praktikas kasutatakse koodi mõistagi veidi erinevas kontekstis. Vidina kujutamine tehakse peaaegu eranditult vidinaklassi meetodiga paintEvent(). </para>
<para>Värvidel on oma osa nii kõverate esitamisel kui kujundite täitmisel. Qt-s esindab värve klass <ulink url="kdeapi:qt/QColor">QColor</ulink>. Qt ei toeta selliseid graafilisi võimalusi, nagu ICC värviprofiilid ja värvikorrektsioon. Värvid konstrueeritakse tavaliselt nende punast, rohelist ja sinist komponenti määratledes, kuna RGB on ka viis, millega esitatakse pikslid monitoril. </para>
<para>Värvidel on oma osa nii kõverate esitamisel kui kujundite täitmisel. Qt-s esindab värve klass <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. Qt ei toeta selliseid graafilisi võimalusi, nagu ICC värviprofiilid ja värvikorrektsioon. Värvid konstrueeritakse tavaliselt nende punast, rohelist ja sinist komponenti määratledes, kuna RGB on ka viis, millega esitatakse pikslid monitoril. </para>
<para>Võimalik on küll kasutada ka tooni, küllastust ja väärtust. Selline HSV on kasutusel GTK värvidialoogis, näiteks rakenduses Gimp. Siin vastab toon värviketta nurgale, küllastus aga tähistab vahemaad ketta keskpunktist. Väärtuse saab määrata eraldi liuguriga. </para>
<para>Võimalik on küll kasutada ka tooni, küllastust ja väärtust. Selline HSV on kasutusel GTK värvidialoogis, näiteks rakenduses Gimp. Siin vastab toon värviketta nurgale, küllastus aga tähistab vahemaad ketta keskpunktist. Väärtuse saab määrata eraldi liuguriga. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> vastab otseselt X11 pikselrasterobjektidele. Pikselrastrid on serveripoolsed objektid, mis moodsate graafikakaartide korral võivad olla isegi vahetult kaardimällu salvestatud. See muudab pikselrastrite edastamise ekraanile <emphasis>äärmiselt</emphasis> tõhusaks ja kiireks. Pikselrastrid toimivad ka vidinate vastena ekraanil - QPixmap on klassi QPaintDevice alamklass, nii et sellega on võimalik kasutada ka QPainterit. Moodsad graafikakaardid üldiselt kiirendavad elementaarseid joonistusoperatsioone. Seepärast on üpris tavaline kasutada pikselrastreid topeltpuhverduseks. See tähendab, et vidina vahetu joonistamise asemel joonistad ajutise pikselrasterobjekti ja kasutad selle edastamiseks vidinale funktsiooni <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink>. Keerulisemate asjade puhul aitab see vältida vilkumist. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> vastab otseselt X11 pikselrasterobjektidele. Pikselrastrid on serveripoolsed objektid, mis moodsate graafikakaartide korral võivad olla isegi vahetult kaardimällu salvestatud. See muudab pikselrastrite edastamise ekraanile <emphasis>äärmiselt</emphasis> tõhusaks ja kiireks. Pikselrastrid toimivad ka vidinate vastena ekraanil - QPixmap on klassi QPaintDevice alamklass, nii et sellega on võimalik kasutada ka QPainterit. Moodsad graafikakaardid üldiselt kiirendavad elementaarseid joonistusoperatsioone. Seepärast on üpris tavaline kasutada pikselrastreid topeltpuhverduseks. See tähendab, et vidina vahetu joonistamise asemel joonistad ajutise pikselrasterobjekti ja kasutad selle edastamiseks vidinale funktsiooni <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink>. Keerulisemate asjade puhul aitab see vältida vilkumist. </para>
<para>Seevastu <ulink url="kdeapi:qt/QImage">QImage</ulink> objektid asuvad kliendi poolel. Nende põhiülesanne on pakkuda vahetut juurdepääsu pildi pikslitele. Nii saab neid kasutada pilditöötluseks ning sellisteks asjadeks nagu laadimine või kettale salvestamine (QPixmapi meetod load() kasutab vaheastmena QImage'it). Teisalt on pildi joonistamine vidinale üsna mahukas operatsioon, sest sellega kaasneb edastamine X'i serverisse, mis võib võtta omajagu aega, eriti kui tegemist on suurte piltidega või kaugserveritega. Sõltuvalt värvisügavusest võib teisendus QImage -> QPixmap nõuda ka pseudotoonimist. </para>
<para>Seevastu <ulink url="kdeapi:qt/TQImage">TQImage</ulink> objektid asuvad kliendi poolel. Nende põhiülesanne on pakkuda vahetut juurdepääsu pildi pikslitele. Nii saab neid kasutada pilditöötluseks ning sellisteks asjadeks nagu laadimine või kettale salvestamine (QPixmapi meetod load() kasutab vaheastmena TQImage'it). Teisalt on pildi joonistamine vidinale üsna mahukas operatsioon, sest sellega kaasneb edastamine X'i serverisse, mis võib võtta omajagu aega, eriti kui tegemist on suurte piltidega või kaugserveritega. Sõltuvalt värvisügavusest võib teisendus TQImage -> QPixmap nõuda ka pseudotoonimist. </para>
<para>Lisaks tavapärastele kirjetele on toodud näites näha, kuidas deklareerida teenuse omadusi. Igale omaduse definitsioonile vastab konfiguratsioonifailis grupp <literal>[PropertyDef::name]</literal>. Selles grupis deklareerib kirje <literal>Type</literal> omaduse tüübi. Võimalikud tüübid on kirjas klassis <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Lisaks tavapärastele kirjetele on toodud näites näha, kuidas deklareerida teenuse omadusi. Igale omaduse definitsioonile vastab konfiguratsioonifailis grupp <literal>[PropertyDef::name]</literal>. Selles grupis deklareerib kirje <literal>Type</literal> omaduse tüübi. Võimalikud tüübid on kirjas klassis <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para><classname>KService</classname> objekti olemasolul on väga lihtne laadida teek ja hankida viit selle pere objektile: </para>
<para><classname>KService</classname> objekti olemasolul on väga lihtne laadida teek ja hankida viit selle pere objektile: </para>
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>Toodud näiteks käivitatakse teenus "nimepidi", s.t. esimene <function>TDEApplication::startServiceByName()</function> argument on nimi, mis on näha töölauafaili real <literal>Name</literal>. Teine võimalus on kasutada funktsiooni <function>TDEApplication::startServiceByDesktopName()</function>, mis võtab argumendiks töölauafaili failinime, s.t. antud juhul <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Toodud näiteks käivitatakse teenus "nimepidi", s.t. esimene <function>TDEApplication::startServiceByName()</function> argument on nimi, mis on näha töölauafaili real <literal>Name</literal>. Teine võimalus on kasutada funktsiooni <function>TDEApplication::startServiceByDesktopName()</function>, mis võtab argumendiks töölauafaili failinime, s.t. antud juhul <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Kõik väljakutsed kasutavad teise argumendina URL-ide nimekirja, mis antakse teenusele käsureal. Kolmas argument on viit klassile <classname>QString</classname>. Kui teenuse käivitamine ebaõnnestub, annab see argument tulemuseks tõlgitud veateate. </para>
<para>Kõik väljakutsed kasutavad teise argumendina URL-ide nimekirja, mis antakse teenusele käsureal. Kolmas argument on viit klassile <classname>TQString</classname>. Kui teenuse käivitamine ebaõnnestub, annab see argument tulemuseks tõlgitud veateate. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Mõistagi suudab isegi KMimeMagic määrata failitüüpi ainult kohalike failide sisu põhjal. Võrgufailide jaoks on veel üks võimalus: </para>
<para>Mõistagi suudab isegi KMimeMagic määrata failitüüpi ainult kohalike failide sisu põhjal. Võrgufailide jaoks on veel üks võimalus: </para>
<para>See eeldab, et oled &kommander;i failis ja sul on ligipääs spetsiaalsele @pid-ile, mis sisaldab protsessi ID-d. Tegelikult on lihtsam asendada <quote>kmdr-executor-@pid</quote> @dcopid-ga. Aga igal juhul on võimalik seda süntaksit kasutada (küll ilma erideta) käsurealt või mis tahes välisest skriptist, et muuta &kommander;i akent. </para>
<para>See eeldab, et oled &kommander;i failis ja sul on ligipääs spetsiaalsele @pid-ile, mis sisaldab protsessi ID-d. Tegelikult on lihtsam asendada <quote>kmdr-executor-@pid</quote> @dcopid-ga. Aga igal juhul on võimalik seda süntaksit kasutada (küll ilma erideta) käsurealt või mis tahes välisest skriptist, et muuta &kommander;i akent. </para>
<para>&kommander; on võtnud kasutusele palju kiirema sisemise &DCOP;-funktsiooni. Selle kasutamine mõne muu rakenduse aknast (konsooli &DCOP; on ikka päris aeglane) tekitab mõningaid raskusi, sest sa pead andma hulganisti infot, sealhulgas väljakutse prototüübi. Eeltoodud käsk võtab siis kuju (pane tähele, et @dcopid on dialoogis tegelikult sisene, aga sa võid selle asendada mis tahes korrektse protsessi ID-ga): </para>
<para>&kommander; on võtnud kasutusele palju kiirema sisemise &DCOP;-funktsiooni. Selle kasutamine mõne muu rakenduse aknast (konsooli &DCOP; on ikka päris aeglane) tekitab mõningaid raskusi, sest sa pead andma hulganisti infot, sealhulgas väljakutse prototüübi. Eeltoodud käsk võtab siis kuju (pane tähele, et @dcopid on dialoogis tegelikult sisene, aga sa võid selle asendada mis tahes korrektse protsessi ID-ga): </para>
<para>Varasemas &kommander;is tähendas &DCOP;-väljakutsete pesastamine skriptikeele struktuuridesse (näiteks <application>bash</application>) seda, et väljakutsed tuli esitada konsoolilt. <emphasis>Kui kasutad sisest &DCOP;-i, käivitatakse esmalt kõik &kommander;i erid ja seejärel skript.</emphasis> Palun loe eelmist lauset veel kord, sest muidu ei ole nutul ja halal piiri, kui <application>bash</application> satub &kommander;i eridega lõpmatusse silmusesse. </para>
<para>Varasemas &kommander;is tähendas &DCOP;-väljakutsete pesastamine skriptikeele struktuuridesse (näiteks <application>bash</application>) seda, et väljakutsed tuli esitada konsoolilt. <emphasis>Kui kasutad sisest &DCOP;-i, käivitatakse esmalt kõik &kommander;i erid ja seejärel skript.</emphasis> Palun loe eelmist lauset veel kord, sest muidu ei ole nutul ja halal piiri, kui <application>bash</application> satub &kommander;i eridega lõpmatusse silmusesse. </para>
<para>On ka uus ja lihtsam viis kasutada &DCOP;-i &kommander;is endas, mida võimaldab objektsüntaks. Oletame, et soovid muuta teksti vidinas nimega @LineEdit1. See käib järgmiselt. </para>
<para>On ka uus ja lihtsam viis kasutada &DCOP;-i &kommander;is endas, mida võimaldab objektsüntaks. Oletame, et soovid muuta teksti vidinas nimega @LineEdit1. See käib järgmiselt. </para>
<para>Tagastab määratud globaalse muutuja väärtuse. Kui skript käivitatakse &kommander;i aknast, lakkavad kõik skriptiga määratud (mitteglobaalsed) muutujad eksisteerimast pärast skripti töö lõpetamist ega ole seepärast enam kasutatavad muudes skriptides või ka sama väljakutse kordamisel. Globaalne <quote>skoop</quote> tähendab seda, et muutuja eksisteerib akna iga protsessi jaoks seni, kuni aken suletakse. Neid muutujaid võib igal ajal muuta funktsiooni <function>@setGlobal</function> uue väljakutsega. </para>
<para>Tagastab määratud globaalse muutuja väärtuse. Kui skript käivitatakse &kommander;i aknast, lakkavad kõik skriptiga määratud (mitteglobaalsed) muutujad eksisteerimast pärast skripti töö lõpetamist ega ole seepärast enam kasutatavad muudes skriptides või ka sama väljakutse kordamisel. Globaalne <quote>skoop</quote> tähendab seda, et muutuja eksisteerib akna iga protsessi jaoks seni, kuni aken suletakse. Neid muutujaid võib igal ajal muuta funktsiooni <function>@setGlobal</function> uue väljakutsega. </para>
<para>Loob muutuja, mis on akna protsessile globaalne ja omistab sellele väärtuse, Väärtuse saab hankida global(QString muutujaNimi) abil või ka uuesti määrata. </para>
<para>Loob muutuja, mis on akna protsessile globaalne ja omistab sellele väärtuse, Väärtuse saab hankida global(TQString muutujaNimi) abil või ka uuesti määrata. </para>
<para>Järgnev nimekiri on vananenud ja siin ära toodud rohkem ajaloo huvides. Kõigi vidinafunktsioonide ajakohastatud täielikku nimekirja pakub <emphasis>funktsioonibrauser</emphasis>, mille saab avada suvalisest &kommander;i tekstiredaktori aknast alumisele vasakpoolsele nupule vajutades. Need on nüüd vidinafunktsioonid, mitte enam &DCOP;-funktsioonid, aga &DCOP;-funktsioonid avaldatakse <emphasis>KommanderIf</emphasis> &DCOP;-liideses, mida kirjeldati eespool. Selle funktsionaalsuse väljakutsete loomise dialoogid on saadaval meie veebileheküljel. </para>
<para>Järgnev nimekiri on vananenud ja siin ära toodud rohkem ajaloo huvides. Kõigi vidinafunktsioonide ajakohastatud täielikku nimekirja pakub <emphasis>funktsioonibrauser</emphasis>, mille saab avada suvalisest &kommander;i tekstiredaktori aknast alumisele vasakpoolsele nupule vajutades. Need on nüüd vidinafunktsioonid, mitte enam &DCOP;-funktsioonid, aga &DCOP;-funktsioonid avaldatakse <emphasis>KommanderIf</emphasis> &DCOP;-liideses, mida kirjeldati eespool. Selle funktsionaalsuse väljakutsete loomise dialoogid on saadaval meie veebileheküljel. </para>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>setText(QString tekst)</term>
<term>setText(TQString tekst)</term>
<listitem>
<listitem>
<para>See eemaldab see vidinas näidatava teksti ja asendab selle antava tekstiga. </para>
<para>See eemaldab see vidinas näidatava teksti ja asendab selle antava tekstiga. </para>
<para>See määrab &kommander;i vaiketekstistringi. Tavaliselt määratakse selleks <quote>@widgetText</quote>, et näidata vidinasse sisestatut. Vaevalt sul seda eriti vaja läheb, aga igatahes on see olemas. Saab kasutada kõigi andmeid sisaldavate vidinate korral. </para>
<para>See määrab &kommander;i vaiketekstistringi. Tavaliselt määratakse selleks <quote>@widgetText</quote>, et näidata vidinasse sisestatut. Vaevalt sul seda eriti vaja läheb, aga igatahes on see olemas. Saab kasutada kõigi andmeid sisaldavate vidinate korral. </para>
<para>Peamiselt on tegemist mallkoodiga, mille üle ei tasu pead murda. Tähele tuleb panna vaid kaht asja: fail kommanderwidget.h peab olema kaasatud kohe alguses ning klass peab olema esmalt tuletatud vidinast, mida me soovime lõimida &kommander;iga ja teiseks KommanderWidget'ist. </para>
<para>Peamiselt on tegemist mallkoodiga, mille üle ei tasu pead murda. Tähele tuleb panna vaid kaht asja: fail kommanderwidget.h peab olema kaasatud kohe alguses ning klass peab olema esmalt tuletatud vidinast, mida me soovime lõimida &kommander;iga ja teiseks KommanderWidget'ist. </para>
<para>cpp-failis on teatud osad, mida tuleb iga konkreetse vidina puhul tähele panna. </para>
<para>cpp-failis on teatud osad, mida tuleb iga konkreetse vidina puhul tähele panna. </para>
<para>Konstruktoris saab määrata vidina võimalikud olekud. Meie tekstikastil ei ole mingeid olekuid, sestap anname talle ainult ühe, vaikimisi oleku <emphasis>default</emphasis>. Kui lood vidina, millel võib olla mitu olekut, näiteks märkekasti, siis saab siin määrata kolm olekut: märkimata (<emphasis>unchecked</emphasis>), poolmärgitud (<emphasis>semichecked</emphasis>) ja märgitud<emphasis>checked</emphasis>. </para>
<para>Konstruktoris saab määrata vidina võimalikud olekud. Meie tekstikastil ei ole mingeid olekuid, sestap anname talle ainult ühe, vaikimisi oleku <emphasis>default</emphasis>. Kui lood vidina, millel võib olla mitu olekut, näiteks märkekasti, siis saab siin määrata kolm olekut: märkimata (<emphasis>unchecked</emphasis>), poolmärgitud (<emphasis>semichecked</emphasis>) ja märgitud<emphasis>checked</emphasis>. </para>
<para>Eespool määrasime konstruktoris olekud ning see tagastab lihtsalt vidina aktiivse oleku. Meie vidina puhul on see alati <emphasis>default</emphasis>, aga muidu tuleb siia kirjutada kood, mis kontrollib, millises olekus vidin parasjagu on, ning tagastab vajaliku teate. </para>
<para>Eespool määrasime konstruktoris olekud ning see tagastab lihtsalt vidina aktiivse oleku. Meie vidina puhul on see alati <emphasis>default</emphasis>, aga muidu tuleb siia kirjutada kood, mis kontrollib, millises olekus vidin parasjagu on, ning tagastab vajaliku teate. </para>
<para>Need on kaks kõige tähtsamat meetodit, mis sisaldavat põhiosa funktsionaalsest koodist. Meetod <emphasis>QString KomLineEdit::widgetText() const</emphasis> tagastab vidina teksti (teksti, milleks tekstiseoses laiendatakse eri <emphasis>@widgetText</emphasis>. Meie vidina puhul on tekst see, mida kirjutatakse tekstikasti, nii et see tagastataksegi. Vidina teksti määramisel tuleb meil määrata tekstikasti kirjutatav tekst. Me saadame pärast vidina teksti määramist signaali <emphasis>widgetTextChanged()</emphasis>, et teised vidinat teaksid, et seda vidinat on uuendatud. </para>
<para>Need on kaks kõige tähtsamat meetodit, mis sisaldavat põhiosa funktsionaalsest koodist. Meetod <emphasis>TQString KomLineEdit::widgetText() const</emphasis> tagastab vidina teksti (teksti, milleks tekstiseoses laiendatakse eri <emphasis>@widgetText</emphasis>. Meie vidina puhul on tekst see, mida kirjutatakse tekstikasti, nii et see tagastataksegi. Vidina teksti määramisel tuleb meil määrata tekstikasti kirjutatav tekst. Me saadame pärast vidina teksti määramist signaali <emphasis>widgetTextChanged()</emphasis>, et teised vidinat teaksid, et seda vidinat on uuendatud. </para>
<para>Vidinale funktsionaalsuse lisamiseks tuleb registreerida vastavad funktsioonid ja lisada neile vajalik kood. Registreerimiseks mõeldud kood tuleb asetada cpp-faili algusse konstruktori ette: </para>
<para>Vidinale funktsionaalsuse lisamiseks tuleb registreerida vastavad funktsioonid ja lisada neile vajalik kood. Registreerimiseks mõeldud kood tuleb asetada cpp-faili algusse konstruktori ette: </para>
KommanderPlugin::registerFunction(Function1, "function1(QString widget, QString arg1, int arg2)", i18n("Call function1 with two arguments, second is optional."), 2, 3);
KommanderPlugin::registerFunction(Function1, "function1(TQString widget, TQString arg1, int arg2)", i18n("Call function1 with two arguments, second is optional."), 2, 3);
KommanderPlugin::registerFunction(function2, "function2(QString widget)", i18n("Get a QString as a result of function2."), 1);
KommanderPlugin::registerFunction(function2, "function2(TQString widget)", i18n("Get a TQString as a result of function2."), 1);
}
}
</screen>
</screen>
<para>See registreerib kaks funktsiooni: <emphasis>function1 ja function2</emphasis>. Funktsioonile omistatav number (siin <emphasis>1160</emphasis> ja <emphasis>1161</emphasis>) peab olema unikaalne, seda ei tohi kasutada üheski muus pluginas ega &kommander;is endas. Funktsioonile <emphasis>function1</emphasis> võib anda kaks argumenti, millest üks pole kohustuslik; funktsioonil <emphasis>function2</emphasis> ei saa anda ühtegi argumenti ja see tagastab stringi. Argument <emphasis>QString widget</emphasis> näitab, et funktsioonid tegutsevad vidinas, näiteks: <emphasis>KomLineEdit.function1("foo", 1)</emphasis>. </para>
<para>See registreerib kaks funktsiooni: <emphasis>function1 ja function2</emphasis>. Funktsioonile omistatav number (siin <emphasis>1160</emphasis> ja <emphasis>1161</emphasis>) peab olema unikaalne, seda ei tohi kasutada üheski muus pluginas ega &kommander;is endas. Funktsioonile <emphasis>function1</emphasis> võib anda kaks argumenti, millest üks pole kohustuslik; funktsioonil <emphasis>function2</emphasis> ei saa anda ühtegi argumenti ja see tagastab stringi. Argument <emphasis>TQString widget</emphasis> näitab, et funktsioonid tegutsevad vidinas, näiteks: <emphasis>KomLineEdit.function1("foo", 1)</emphasis>. </para>
<para>Et ka &kommander; teaks ,et vidin neid funktsioone toetab, lisa selline meetod: </para>
<para>Et ka &kommander; teaks ,et vidin neid funktsioone toetab, lisa selline meetod: </para>
<para>See tähendab, et KomLineEdit toetab ülaltoodud funktsioone ja standardset funktsiooni <emphasis>text</emphasis>. Funktsiooni koodi saab käsitleda meetodi handleDCOP raames: </para>
<para>See tähendab, et KomLineEdit toetab ülaltoodud funktsioone ja standardset funktsiooni <emphasis>text</emphasis>. Funktsiooni koodi saab käsitleda meetodi handleDCOP raames: </para>
<para>Tegemist on juhtudega, kus vidin võib olla redaktoris ja executoris erinev, näiteks skriptiobjektide, infodialoogi vms. puhul. Tavaliselt näidatakse vidina asemel QLabel'it. Selleks peab vidin tulenema QLabel'ist, milleks konstruktoris peab seisma järgmine kood: </para>
<para>Tegemist on juhtudega, kus vidin võib olla redaktoris ja executoris erinev, näiteks skriptiobjektide, infodialoogi vms. puhul. Tavaliselt näidatakse vidina asemel QLabel'it. Selleks peab vidin tulenema QLabel'ist, milleks konstruktoris peab seisma järgmine kood: </para>
<para>Ka vidina enda (kui sul läheb üldse vidinat tarvis - vahest pakub sinu "vidin" kõigest võimalust kasutada andmebaasi vms.) võib luua mõnes funktsioonis, näiteks funktsioonis <emphasis>execute</emphasis>. Toome näite infodialoogi põhjal: </para>
<para>Ka vidina enda (kui sul läheb üldse vidinat tarvis - vahest pakub sinu "vidin" kõigest võimalust kasutada andmebaasi vms.) võib luua mõnes funktsioonis, näiteks funktsioonis <emphasis>execute</emphasis>. Toome näite infodialoogi põhjal: </para>
<para>Seejärel loome KommanderPlugin'i alamklassi <emphasis>MyKomPlugin</emphasis>. See sisaldab lihtsalt konstruktorit ja tühistavat loomismeetodit. </para>
<para>Seejärel loome KommanderPlugin'i alamklassi <emphasis>MyKomPlugin</emphasis>. See sisaldab lihtsalt konstruktorit ja tühistavat loomismeetodit. </para>
@ -196,7 +196,7 @@ public:
</screen>
</screen>
<para>Plugina konstruktoris kutsume <emphasis>addWidget()</emphasis> välja iga vidina puhul, mida plugin meie soovide kohaselt peab pakkuda. <emphasis>addWidget()</emphasis> võib kasutada kuut argumenti, aga vajalikud on ainult esimesed neli. Argumendid on järgmises järjekorras: vidina klassi nimi, grupp, kohtspikker, redaktori tööriistaribal kasutatava ikooni ikoonirühm, 'Mis see on?' teave ning tõeväärtus, mis osutab, kas vidin on teiste vidinate konteiner või mitte. Seda teavet kasutab redaktor vidinate rühmitamisel menüüs, abiinfo pakkumisel jne. </para>
<para>Plugina konstruktoris kutsume <emphasis>addWidget()</emphasis> välja iga vidina puhul, mida plugin meie soovide kohaselt peab pakkuda. <emphasis>addWidget()</emphasis> võib kasutada kuut argumenti, aga vajalikud on ainult esimesed neli. Argumendid on järgmises järjekorras: vidina klassi nimi, grupp, kohtspikker, redaktori tööriistaribal kasutatava ikooni ikoonirühm, 'Mis see on?' teave ning tõeväärtus, mis osutab, kas vidin on teiste vidinate konteiner või mitte. Seda teavet kasutab redaktor vidinate rühmitamisel menüüs, abiinfo pakkumisel jne. </para>
<para>Mis puutub ikooni, siis toodud näide laadib keskmise suurusega ikooni <emphasis>ikooninimi</emphasis> &kde; ikoonide standardsest asukohast. </para>
<para>Mis puutub ikooni, siis toodud näide laadib keskmise suurusega ikooni <emphasis>ikooninimi</emphasis> &kde; ikoonide standardsest asukohast. </para>
return(var)</screen> Nüüd tagastatakse teatelogis <emphasis>Stderr</emphasis> <emphasis>HELLO WORLD</emphasis>. </para>
return(var)</screen> Nüüd tagastatakse teatelogis <emphasis>Stderr</emphasis> <emphasis>HELLO WORLD</emphasis>. </para>
<para>Skripti pesaga ühendatud signaali vastuvõtmine käib samamoodi. <emphasis>Self.Item(0)</emphasis> on esimene parameeter jne. Edastatud argumentide arvu hankimiseks on mõeldud <emphasis>ScriptObject.count</emphasis>. </para>
<para>Skripti pesaga ühendatud signaali vastuvõtmine käib samamoodi. <emphasis>Self.Item(0)</emphasis> on esimene parameeter jne. Edastatud argumentide arvu hankimiseks on mõeldud <emphasis>ScriptObject.count</emphasis>. </para>
<para>Käserea parameetrid lubavad nii nimega kui ka nimeta argumente. Nimeta argument näeb välja selline: <screen>kmdr-executor myprog.kmdr 100 red</screen> kus _ARG1 = 100 ja _ARG2 = red. Tühikutega stringide edastamisel argumendina tuleb nad panna jutumärkidesse. Dialoogikäsu kasutamine muudab asjad keerulisemaks, sest kogu argumendistring tuleb edastada tervikuna, mis tähendab selle asetamist jutumärkidesse. <screen>dialog("mydialog.kmdr", 100+" \"Hello World\"")</screen> See tagastab <emphasis>_ARG1 = 100</emphasis> ja <emphasis>_ARG2 = Hello World</emphasis>. Ilma jutumärkideta saaksid <emphasis>_ARG2 = Hello</emphasis> ja <emphasis>_ARG3 = World</emphasis>. Nimega parameetrite kasutamine on kenam ja mitte nii segadusseajav. <screen>dialog("mydialog.kmdr", "xcount=100 xquote=Hello world")</screen> Nüüd saad neid kasutada globaalsete muutujatega <emphasis>_xcount</emphasis> ja <emphasis>_xquote</emphasis>. </para>
<para>Käserea parameetrid lubavad nii nimega kui ka nimeta argumente. Nimeta argument näeb välja selline: <screen>kmdr-executor myprog.kmdr 100 red</screen> kus _ARG1 = 100 ja _ARG2 = red. Tühikutega stringide edastamisel argumendina tuleb nad panna jutumärkidesse. Dialoogikäsu kasutamine muudab asjad keerulisemaks, sest kogu argumendistring tuleb edastada tervikuna, mis tähendab selle asetamist jutumärkidesse. <screen>dialog("mydialog.kmdr", 100+" \"Hello World\"")</screen> See tagastab <emphasis>_ARG1 = 100</emphasis> ja <emphasis>_ARG2 = Hello World</emphasis>. Ilma jutumärkideta saaksid <emphasis>_ARG2 = Hello</emphasis> ja <emphasis>_ARG3 = World</emphasis>. Nimega parameetrite kasutamine on kenam ja mitte nii segadusseajav. <screen>dialog("mydialog.kmdr", "xcount=100 xquote=Hello world")</screen> Nüüd saad neid kasutada globaalsete muutujatega <emphasis>_xcount</emphasis> ja <emphasis>_xquote</emphasis>. </para>
<para>DCOP võib olla päris keeruline, mistõttu me soovitame kasutada meie tööriistu DCOP-i lubamiseks &kommander;i võrgudialoogides näiteks funktsioonisirvijaga. Toome näite DCOP-i väljakutse kohta dialoogist, mis on avatud &kommander;i eellasaknast. Kuna ta teab oma eellast, võib ta saata teabe tagasi ajal, mil ta on avatud, ning vabalt kasutada kõiki oma eellase funktsioone, välja arvatud pesad. Loomulikult saab seda teha ka seesmiselt skriptiga, mis kutstutakse välja väliselt, nii et praktikas ei ole sisuliselt mingeid piire. <screen>dcop("kmdr-executor-"+parentPid, "KommanderIf", "setText(QString,QString)", "StatusBar8", "Hello")</screen> Vaatame seda osade kaupa. Kõigepealt lisame <emphasis>parentPid</emphasis> "kmdr-ececutor-"-ile, sest me ei saa eeldada, et väljakutsuja on &kommander;i aken. Seda võib kasutada Quanta või KSpreadi või millega tahes. Seejärel adresseerime <emphasis>KommanderIf</emphasis>'i, mis on <emphasis>kena</emphasis> ja puhastatud liides lõppkasutajale. Me loodame, et kui KDE lõpuks KDE4 ajal vahetab DCOP-i välja D-Busi vastu, võtab aina enam rakendusi omaks selle kena lõimimist soodustava liidese. Järgmine parameeter <emphasis>"setText(QString,QString)"</emphasis> on oluline, sest see muudab lubatud parameetrid <emphasis>prototüübiks</emphasis>. Vastasel juhul ei suudaks &kommander; väljakutset valideerida. Niisiis ilma DCOP-väljakutse definitsioonita on tulemuseks viga. Ülejäänud on mõistagi edastatavad parameetrid. Me soovitame uurida rakendusi, mis kasutavad <command>kdcop</command>'i, kui soovid näha, kuidas see töötab, ning harjutada DCOP-väljakutsetega shellis, kuni omandad õige süntaksi. </para>
<para>DCOP võib olla päris keeruline, mistõttu me soovitame kasutada meie tööriistu DCOP-i lubamiseks &kommander;i võrgudialoogides näiteks funktsioonisirvijaga. Toome näite DCOP-i väljakutse kohta dialoogist, mis on avatud &kommander;i eellasaknast. Kuna ta teab oma eellast, võib ta saata teabe tagasi ajal, mil ta on avatud, ning vabalt kasutada kõiki oma eellase funktsioone, välja arvatud pesad. Loomulikult saab seda teha ka seesmiselt skriptiga, mis kutstutakse välja väliselt, nii et praktikas ei ole sisuliselt mingeid piire. <screen>dcop("kmdr-executor-"+parentPid, "KommanderIf", "setText(TQString,TQString)", "StatusBar8", "Hello")</screen> Vaatame seda osade kaupa. Kõigepealt lisame <emphasis>parentPid</emphasis> "kmdr-ececutor-"-ile, sest me ei saa eeldada, et väljakutsuja on &kommander;i aken. Seda võib kasutada Quanta või KSpreadi või millega tahes. Seejärel adresseerime <emphasis>KommanderIf</emphasis>'i, mis on <emphasis>kena</emphasis> ja puhastatud liides lõppkasutajale. Me loodame, et kui KDE lõpuks KDE4 ajal vahetab DCOP-i välja D-Busi vastu, võtab aina enam rakendusi omaks selle kena lõimimist soodustava liidese. Järgmine parameeter <emphasis>"setText(TQString,TQString)"</emphasis> on oluline, sest see muudab lubatud parameetrid <emphasis>prototüübiks</emphasis>. Vastasel juhul ei suudaks &kommander; väljakutset valideerida. Niisiis ilma DCOP-väljakutse definitsioonita on tulemuseks viga. Ülejäänud on mõistagi edastatavad parameetrid. Me soovitame uurida rakendusi, mis kasutavad <command>kdcop</command>'i, kui soovid näha, kuidas see töötab, ning harjutada DCOP-väljakutsetega shellis, kuni omandad õige süntaksi. </para>
</sect2>
</sect2>
</sect1>
</sect1>
<!--
<!--
@ -332,7 +332,7 @@ end
<listitem>
<listitem>
<para><command>createWidget(<parameter>vidinanimi</parameter>, <parameter>vidinatüüp</parameter>, <parameter>eellane</parameter>)</command> - loob uue vidina. Seejärel võib selle asetada näiteks tabelisse või tööriistakasti ja muuta <command>minuvidin.show(true)</command> abil nähtavaks. Kui asetad uue vidina vormi, pead mõtlema ka paigutusele. &kommander; ei loo paigutusi lennult ega muuda pikslikaupa positsioneerimist (enamasti). See on veidi häiriv isegi C++ arenduse korral. Me soovitame kasutada rühmakasti ja tegelda paigutusega dialoogis, mis võimaldab parima kontrolli asjade käigu üle. </para></listitem>
<para><command>createWidget(<parameter>vidinanimi</parameter>, <parameter>vidinatüüp</parameter>, <parameter>eellane</parameter>)</command> - loob uue vidina. Seejärel võib selle asetada näiteks tabelisse või tööriistakasti ja muuta <command>minuvidin.show(true)</command> abil nähtavaks. Kui asetad uue vidina vormi, pead mõtlema ka paigutusele. &kommander; ei loo paigutusi lennult ega muuda pikslikaupa positsioneerimist (enamasti). See on veidi häiriv isegi C++ arenduse korral. Me soovitame kasutada rühmakasti ja tegelda paigutusega dialoogis, mis võimaldab parima kontrolli asjade käigu üle. </para></listitem>
<listitem>
<listitem>
<para><command>connect(<parameter>saatja</parameter>, <parameter>signaal</parameter>, <parameter>saaja</parameter>, <parameter>pesa</parameter>)</command> - ühendab vidina signaali vidina pesaga. Uuri ühenduse dialoogi ja vali sarnased vidinad võimaluste selgitamiseks. Kui näiteks signaal näeb välja nagu <command>execute(const QString&)</command>, siis peabki just see siin jutumärkides olema. </para></listitem>
<para><command>connect(<parameter>saatja</parameter>, <parameter>signaal</parameter>, <parameter>saaja</parameter>, <parameter>pesa</parameter>)</command> - ühendab vidina signaali vidina pesaga. Uuri ühenduse dialoogi ja vali sarnased vidinad võimaluste selgitamiseks. Kui näiteks signaal näeb välja nagu <command>execute(const TQString&)</command>, siis peabki just see siin jutumärkides olema. </para></listitem>
<listitem>
<listitem>
<para><command>disconnect(<parameter>saatja</parameter>, <parameter>signaal</parameter>, <parameter>saaja</parameter>, <parameter>pesa</parameter>)</command> - tühistab eeltoodud ühenduse. Ka siin on oluline täpne süntaks. </para></listitem>
<para><command>disconnect(<parameter>saatja</parameter>, <parameter>signaal</parameter>, <parameter>saaja</parameter>, <parameter>pesa</parameter>)</command> - tühistab eeltoodud ühenduse. Ka siin on oluline täpne süntaks. </para></listitem>
<para>Üks väga kasulik Qt Disainerilt üle võetud omadus on signaalid ja pesad. Liidest on muidugi muudetud, et see arvestaks paremini &kommander;i kasutajaid. Signaalid ja pesad on Qt/KDE rakenduse sisemised sündmuste juhtelemendid. Me oleme püüdnud teha nii, et sa ei peaks midagi teadma C++ andmetüüpide erinevusest, aga kui kasutad uut funktsiooni ühenduse lennult loomiseks, on mugav kopeerida see teave ühenduse tööriistast. Vaatame, mida see siis tähendab. Ühes vidinas juhtub midagi. See võib olla klõps, topeltklõps, väärtuse muutmine, milegi valimine või menõüü kasutamine. Need on lihtsalt valik sündmusi, mis saadavd teele signaali. Nimekirja saab muuta loendikastis, kui teed liitkastis uue valiku. See on kasulik keerukama rakenduse puhul ning ainus viis, kuidas seda teha ilma järgmist nuppu klõpsamata, ongi signaali ühendamine pesaga. Pesa võib olla skript või nupp. Kui pesa saab signaali, teeb see seda, mida signaal ütleb. Ühenduste redigeerimiseks on omaette tööriist. Ole selle kasutamisel hoolikas, sest on terve hulk päritud signaale ja pesasid. Nii võib näiteks tekkida segadus, kui kogemata annad skriptile, mis on nähtamatu, kui dialoog töötab, ülesande muuta selle suurust, mitte aga seda käivitada. </para>
<para>Üks väga kasulik Qt Disainerilt üle võetud omadus on signaalid ja pesad. Liidest on muidugi muudetud, et see arvestaks paremini &kommander;i kasutajaid. Signaalid ja pesad on Qt/KDE rakenduse sisemised sündmuste juhtelemendid. Me oleme püüdnud teha nii, et sa ei peaks midagi teadma C++ andmetüüpide erinevusest, aga kui kasutad uut funktsiooni ühenduse lennult loomiseks, on mugav kopeerida see teave ühenduse tööriistast. Vaatame, mida see siis tähendab. Ühes vidinas juhtub midagi. See võib olla klõps, topeltklõps, väärtuse muutmine, milegi valimine või menõüü kasutamine. Need on lihtsalt valik sündmusi, mis saadavd teele signaali. Nimekirja saab muuta loendikastis, kui teed liitkastis uue valiku. See on kasulik keerukama rakenduse puhul ning ainus viis, kuidas seda teha ilma järgmist nuppu klõpsamata, ongi signaali ühendamine pesaga. Pesa võib olla skript või nupp. Kui pesa saab signaali, teeb see seda, mida signaal ütleb. Ühenduste redigeerimiseks on omaette tööriist. Ole selle kasutamisel hoolikas, sest on terve hulk päritud signaale ja pesasid. Nii võib näiteks tekkida segadus, kui kogemata annad skriptile, mis on nähtamatu, kui dialoog töötab, ülesande muuta selle suurust, mitte aga seda käivitada. </para>
<para>Ühenduste tööriista saab avada, kui teed kuskil dialoogis paremklõpsu ja valid selle kontekstimenüüst. Klõpsa menüüs ja näedki akent ühenduste nimekirjaga. Nimekirja kohal on signaalide ja pesade loendid ning nende kohal on valitud vajalikud saatja ja saaja. Väga lihtne on ühendusi luua visuaalselt. Vaata tööriistariba või menüüd Tööriistad. Seal on kolm elementi: viit, signaalide ja pesade ühendused ning kaartide järjekord või vidinad. Valimisel määratakse ühenduse režiim. Klõpsa vidinal, mis saadab signaali, ja lohista see vidinale, mis peab pesana signaali saama. Seda tehes näed joont ja hiire alla jäävale vidinale tekkivat kukutamismärki. Redaktori olekuriba annab teada, mida ühendatakse. </para>
<para>Ühenduste tööriista saab avada, kui teed kuskil dialoogis paremklõpsu ja valid selle kontekstimenüüst. Klõpsa menüüs ja näedki akent ühenduste nimekirjaga. Nimekirja kohal on signaalide ja pesade loendid ning nende kohal on valitud vajalikud saatja ja saaja. Väga lihtne on ühendusi luua visuaalselt. Vaata tööriistariba või menüüd Tööriistad. Seal on kolm elementi: viit, signaalide ja pesade ühendused ning kaartide järjekord või vidinad. Valimisel määratakse ühenduse režiim. Klõpsa vidinal, mis saadab signaali, ja lohista see vidinale, mis peab pesana signaali saama. Seda tehes näed joont ja hiire alla jäävale vidinale tekkivat kukutamismärki. Redaktori olekuriba annab teada, mida ühendatakse. </para>
<note><para>&kommander;i versioonis 1.3 on funktsioon connect(), mis võimaldab ühendada signaale ja pesasid lennult. See on kasuks, kui pruukisid äsja createWidgetit. Dialoogi ei saa mõistagi kasutada millekski, mille olemasolust ei ole &kommander; veel teadlik. Paraku on kombinatsioone nii palju, et sul tuleb signaalid ja pesad kirja panna. <emphasis>Need tuleb kirjutada täiesti täpselt, sest muidu nad ei toimi</emphasis>. Siin on taas abiks ühenduste tööriist. Ava see ja vali kaks vidinat, mida soovid ühendada. Loe ühenduse teavet. Kui see ütleb näiteks <command>execute(const QString&)</command>, siis just nii tuleb ka kirjutada.</para></note>
<note><para>&kommander;i versioonis 1.3 on funktsioon connect(), mis võimaldab ühendada signaale ja pesasid lennult. See on kasuks, kui pruukisid äsja createWidgetit. Dialoogi ei saa mõistagi kasutada millekski, mille olemasolust ei ole &kommander; veel teadlik. Paraku on kombinatsioone nii palju, et sul tuleb signaalid ja pesad kirja panna. <emphasis>Need tuleb kirjutada täiesti täpselt, sest muidu nad ei toimi</emphasis>. Siin on taas abiks ühenduste tööriist. Ava see ja vali kaks vidinat, mida soovid ühendada. Loe ühenduse teavet. Kui see ütleb näiteks <command>execute(const TQString&)</command>, siis just nii tuleb ka kirjutada.</para></note>
<para>Avant que votre application en commence son travail de calcul intensif, ou avant qu'elle ne commence à charger des modules externes, &etc;, invoquez &ksplash; comme suit:</para>
<para>Avant que votre application en commence son travail de calcul intensif, ou avant qu'elle ne commence à charger des modules externes, &etc;, invoquez &ksplash; comme suit:</para>
<listitem><para>Les classes de modules externes devraient fournir une fonction <literal>static</literal> nommée <function>names</function>, qui retourne une liste de noms par lesquels elle peut être invoquée.</para></listitem>
<listitem><para>Les classes de modules externes devraient fournir une fonction <literal>static</literal> nommée <function>names</function>, qui retourne une liste de noms par lesquels elle peut être invoquée.</para></listitem>
<listitem><para>Si l'additif peut être configuré dans le module du centre de configuration, il devrait fournir une classe <literal>ThemeEngineConfig</literal> pour la configuration.</para></listitem>
<listitem><para>Si l'additif peut être configuré dans le module du centre de configuration, il devrait fournir une classe <literal>ThemeEngineConfig</literal> pour la configuration.</para></listitem>
<listitem><para>La classe de l'additif doit écraser au moins une des fonctions virtuelles<function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> et <function>slotUpdateSteps</function> pour la rendre utilisable.</para></listitem>
<listitem><para>La classe de l'additif doit écraser au moins une des fonctions virtuelles<function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> et <function>slotUpdateSteps</function> pour la rendre utilisable.</para></listitem>
<listitem><para>Le constructeur doit prendre la forme <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> de telle manière qu'il peut être utilisé avec <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Le constructeur doit prendre la forme <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> de telle manière qu'il peut être utilisé avec <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>La dernière chose nécessaire peut sembler compliquée, mais, comme nous le verrons plus tard, en ajoutant une simple ligne à vos fichiers source, vous pouvez habituellement ignorer cela.</para>
<para>La dernière chose nécessaire peut sembler compliquée, mais, comme nous le verrons plus tard, en ajoutant une simple ligne à vos fichiers source, vous pouvez habituellement ignorer cela.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Analysons le listing ci-dessus. La classe <classname>Theme2k</classname> satisfait les conventions de nommage, et est héritée de <classname>ThemeEngine</classname>. Elle fournit un <methodname>Theme2k::names()</methodname>, et a un constructeur qui prend les paramètres requis: <function>Theme2k( QWidget *, const char *, const QStringList& );</function>, et fournit aussi une méthode <methodname>Theme2k::slotSetText()</methodname> simple. Pour le moment, ne vous inquiétez pas à propos de la classe <classname>RotWidget</classname>. C'est un petit widget qui fournit des choses agréables à l'œil pour l'utilisateur. Notre additif est très simple et n'affiche pas d'icône ou de barre de progression. Si vous voulez afficher des icônes, écrasez la fonction <function>slotSetPixmap</function>. Des fonctions similaires existent pour la plage de la barre de progression (<function>slotUpdateSteps</function>) et l'incrémentation (<function>slotUpdateProgress</function>) le pas courant. </para>
<para>Analysons le listing ci-dessus. La classe <classname>Theme2k</classname> satisfait les conventions de nommage, et est héritée de <classname>ThemeEngine</classname>. Elle fournit un <methodname>Theme2k::names()</methodname>, et a un constructeur qui prend les paramètres requis: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function>, et fournit aussi une méthode <methodname>Theme2k::slotSetText()</methodname> simple. Pour le moment, ne vous inquiétez pas à propos de la classe <classname>RotWidget</classname>. C'est un petit widget qui fournit des choses agréables à l'œil pour l'utilisateur. Notre additif est très simple et n'affiche pas d'icône ou de barre de progression. Si vous voulez afficher des icônes, écrasez la fonction <function>slotSetPixmap</function>. Des fonctions similaires existent pour la plage de la barre de progression (<function>slotUpdateSteps</function>) et l'incrémentation (<function>slotUpdateProgress</function>) le pas courant. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implémentation de l'additif</title>
<title>Implémentation de l'additif</title>
@ -686,7 +686,7 @@ private:
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> est déclarée dans <filename>kgenericfactory.h</filename>. En avant vers le constructeur! Comme c'est un additif très simple, le constructeur est minimaliste.</para>
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> est déclarée dans <filename>kgenericfactory.h</filename>. En avant vers le constructeur! Comme c'est un additif très simple, le constructeur est minimaliste.</para>
<para>L'interface <abbrev>DCOP</abbrev> de &kstars; inclut les fonctions suivantes: <itemizedlist>
<para>L'interface <abbrev>DCOP</abbrev> de &kstars; inclut les fonctions suivantes: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: pointer le focus d'affichage dans une direction spécifiée par l'argument. Ceci peut être le nom de n'importe quel objet dans le ciel, ou une des directions suivantes: zenith (ou z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: pointer le focus d'affichage dans une direction spécifiée par l'argument. Ceci peut être le nom de n'importe quel objet dans le ciel, ou une des directions suivantes: zenith (ou z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ad, double déc )</function>: pointer le focus d'affichage aux coordonnées équatoriales spécifiées. </para></listitem>
<listitem><para><function> setRaDec( double ad, double déc )</function>: pointer le focus d'affichage aux coordonnées équatoriales spécifiées. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: pause pendant t secondes avant de continuer avec les commandes suivantes du script. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: pause pendant t secondes avant de continuer avec les commandes suivantes du script. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: arrêter l'exécution du script jusqu'à ce que l'utilisateur enfonce la touche spécifiée. À cet endroit, vous ne pouvez pas spécifier de combinaisons de touches (comme <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); utilisez de simples touches. Vous pouvez écrire <quote>space</quote> pour indiquer la barre d'espacement. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: arrêter l'exécution du script jusqu'à ce que l'utilisateur enfonce la touche spécifiée. À cet endroit, vous ne pouvez pas spécifier de combinaisons de touches (comme <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); utilisez de simples touches. Vous pouvez écrire <quote>space</quote> pour indiquer la barre d'espacement. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: inverser l'utilisation du mode de suivi ou non. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: inverser l'utilisation du mode de suivi ou non. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString valeur )</function>: ajuster une option d'affichage. Il y a des douzaines et des douzaines d'options disponibles; en gros, tout ce que vous pouvez changer dans la fenêtre <guilabel>Configuration de &kstars;</guilabel>, vous pouvez le changer ici. Le premier argument est le nom de l'option (les noms sont pris dans le fichier de configuration <filename>kstarsrc</filename>), et le second argument est la valeur désirée. L'analyseur d'arguments est conçu pour être robuste. Ainsi, si vous envoyez accidentellement une mauvaise donnée, il devrait échouer sans heurt. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString valeur )</function>: ajuster une option d'affichage. Il y a des douzaines et des douzaines d'options disponibles; en gros, tout ce que vous pouvez changer dans la fenêtre <guilabel>Configuration de &kstars;</guilabel>, vous pouvez le changer ici. Le premier argument est le nom de l'option (les noms sont pris dans le fichier de configuration <filename>kstarsrc</filename>), et le second argument est la valeur désirée. L'analyseur d'arguments est conçu pour être robuste. Ainsi, si vous envoyez accidentellement une mauvaise donnée, il devrait échouer sans heurt. </para></listitem>
<listitem><para><function> setGeoLocation( const QString ville, const QString province, const QString pays )</function>: changer l'emplacement d'observation pour la ville spécifiée. Si aucune ville correspondant à l'argument n'est trouvée, rien ne se passe. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString ville, const TQString province, const TQString pays )</function>: changer l'emplacement d'observation pour la ville spécifiée. Si aucune ville correspondant à l'argument n'est trouvée, rien ne se passe. </para></listitem>
<listitem><para><function> stop()</function> [clock]: arrêter l'horloge de simulation. </para></listitem>
<listitem><para><function> stop()</function> [clock]: arrêter l'horloge de simulation. </para></listitem>
<listitem><para>Fonctions génériques du matériel: fonctions pour établir/arrêter le matériel, etc.</para>
<listitem><para>Fonctions génériques du matériel: fonctions pour établir/arrêter le matériel, etc.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString deviceName, bool useLocal)</function>: établir un service INDI, soit en local, soit en serveur.</para></listitem>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function>: établir un service INDI, soit en local, soit en serveur.</para></listitem>
<listitem><para><function>shutdownINDI (QString deviceName)</function>: arrêter le service INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function>: arrêter le service INDI.</para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function>: connecter ou déconnecter un service INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function>: connecter ou déconnecter un service INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString deviceName, QString port)</function>: déterminer le port de connexion du matériel.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function>: déterminer le port de connexion du matériel.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function>: active une action INDI. L'action peut êtren'importequel <emphasis>élément</emphasis> dans une <emphasis>propriété d'interrpution</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function>: active une action INDI. L'action peut êtren'importequel <emphasis>élément</emphasis> dans une <emphasis>propriété d'interrpution</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function>: mettre en pause l'exécution du script jusqu'à ce que l'action spécifiée <emphasis>property</emphasis> retourne l'état OK.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function>: mettre en pause l'exécution du script jusqu'à ce que l'action spécifiée <emphasis>property</emphasis> retourne l'état OK.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fonctions de télescope: les fonctions pour contrôler le mouvement et l'état du télescope.</para>
<listitem><para>Fonctions de télescope: les fonctions pour contrôler le mouvement et l'état du télescope.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function>: détermine le mode ou l'action du télescope. Les options disponibles sont SLEW, TRACK, SYNC, PARK, et ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function>: détermine le mode ou l'action du télescope. Les options disponibles sont SLEW, TRACK, SYNC, PARK, et ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function>: détermine les coordonnées de la cible JNow du télescope à <emphasis>AD</emphasis> et <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function>: détermine les coordonnées de la cible JNow du télescope à <emphasis>AD</emphasis> et <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function>: Détermine les coordonnées de cible JNow du télescope de <emphasis>objectName</emphasis>. KStars cherchera le nom de l'objet dans sa base de données et cherchera l'AD et la Déc une fois trouvé.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function>: Détermine les coordonnées de cible JNow du télescope de <emphasis>objectName</emphasis>. KStars cherchera le nom de l'objet dans sa base de données et cherchera l'AD et la Déc une fois trouvé.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function>: détermine l'emplacement géographique du télescope aux longitude et latitude spécifiées. La longitude est mesurée depuis Greenwich, Angleterre, vers l'Est. Cependant, alors qu'il est habituel d'utiliser des longitudes négatives vers l'Ouest, INDI utilise des longitudes entre 0 et 360 degrés. Ainsi, si vous avez une longitude négative, ajoutez simplement 360 degrés pour obtenir la valeur que INDI attend. Par exemple, les coordonnées de Calgary, Canada dans &kstars; sont -114 04 58; latitude: 51 02 58. Vous devrez fournir une longitude de 360 - 114.069 = 245.931 degrés.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function>: détermine l'emplacement géographique du télescope aux longitude et latitude spécifiées. La longitude est mesurée depuis Greenwich, Angleterre, vers l'Est. Cependant, alors qu'il est habituel d'utiliser des longitudes négatives vers l'Ouest, INDI utilise des longitudes entre 0 et 360 degrés. Ainsi, si vous avez une longitude négative, ajoutez simplement 360 degrés pour obtenir la valeur que INDI attend. Par exemple, les coordonnées de Calgary, Canada dans &kstars; sont -114 04 58; latitude: 51 02 58. Vous devrez fournir une longitude de 360 - 114.069 = 245.931 degrés.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function>: détermine la date et l'heure UTC en format ISO8601. Le format est AAAA-MM-JJTHH:MM:SS (&pex; 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function>: détermine la date et l'heure UTC en format ISO8601. Le format est AAAA-MM-JJTHH:MM:SS (&pex; 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function>: fonctions pour contrôler les propriétés et l'état des caméras et CCD.</para>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function>: fonctions pour contrôler les propriétés et l'état des caméras et CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function>: détermine la température de la puce cible en degrés Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function>: détermine la température de la puce cible en degrés Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString deviceName, QString type)</function>: détermine le type de cadre CCD. Les options disponibles sont FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, et FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function>: détermine le type de cadre CCD. Les options disponibles sont FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, et FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function> : commencer l'exposition CCD/Caméra pour la durée spécifiée par <emphasis>timeout</emphasis> en secondes.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function> : commencer l'exposition CCD/Caméra pour la durée spécifiée par <emphasis>timeout</emphasis> en secondes.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fonctions de focus: fonctions pour contrôler le mouvement et l'état du viseur.</para>
<listitem><para>Fonctions de focus: fonctions pour contrôler le mouvement et l'état du viseur.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function>: déterminer la vitesse du viseur. Les options disponibles sont FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, et FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function>: déterminer la vitesse du viseur. Les options disponibles sont FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, et FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function>: déterminer la durée en secondes pour n'importe quelle opération consécutive à startINDIFocus.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function>: déterminer la durée en secondes pour n'importe quelle opération consécutive à startINDIFocus.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function>: déplacer le viseur soit en rapprochement (focusDir = 0), soit en éloignement (focusDir = 1). La vitesse et la durée de cette opération sont déterminées par les fonctions <function>setINDIFocusSpeed()</function> et <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function>: déplacer le viseur soit en rapprochement (focusDir = 0), soit en éloignement (focusDir = 1). La vitesse et la durée de cette opération sont déterminées par les fonctions <function>setINDIFocusSpeed()</function> et <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fonctions de filtrage: fonctions pour contrôler la position du filtre.</para>
<listitem><para>Fonctions de filtrage: fonctions pour contrôler la position du filtre.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function>: changer la position du filtre en <varname>filter_num</varname>. L'utilisateur peut assigner des alias aux numéros des filtres dans la boîte de dialogue <guimenuitem>Configuration d'INDI</guimenuitem> sous le menu <guimenu>Périphériques</guimenu> (&pex; Filter 1 = Red, Filter 2 = Green..etc).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function>: changer la position du filtre en <varname>filter_num</varname>. L'utilisateur peut assigner des alias aux numéros des filtres dans la boîte de dialogue <guimenuitem>Configuration d'INDI</guimenuitem> sous le menu <guimenu>Périphériques</guimenu> (&pex; Filter 1 = Red, Filter 2 = Green..etc).</para></listitem>
<para>Vous pouvez obtenir une liste de toutes les interfaces &DCOP; disponibles. Utilisez l'argument correspondant, comme indiqué dans cet exemple: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Vous pouvez obtenir une liste de toutes les interfaces &DCOP; disponibles. Utilisez l'argument correspondant, comme indiqué dans cet exemple: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Indique la couleur de fond pour l'affichage du message. La chaîne peut être dans le format « #RRGGBB» (comme retourné par <methodname>QColor::name()</methodname>), où «RR», «GG» et «BB» sont des valeurs hexadécimales à deux chiffres pour «red» (rouge), «green» (vert) et «blue» (bleu). Sinon, la chaîne peut être dans n'importe lequel des autres formats acceptés par <methodname>QColor::setNamedColor()</methodname>, comme un nom tiré de la base de données des couleurs X (&pex; «red» (rouge) ou «steelblue» (bleu acier). Donnez à la chaîne une valeur nulle pour spécifier la couleur de fond par défaut actuelle.</para>
<para>Indique la couleur de fond pour l'affichage du message. La chaîne peut être dans le format « #RRGGBB» (comme retourné par <methodname>TQColor::name()</methodname>), où «RR», «GG» et «BB» sont des valeurs hexadécimales à deux chiffres pour «red» (rouge), «green» (vert) et «blue» (bleu). Sinon, la chaîne peut être dans n'importe lequel des autres formats acceptés par <methodname>TQColor::setNamedColor()</methodname>, comme un nom tiré de la base de données des couleurs X (&pex; «red» (rouge) ou «steelblue» (bleu acier). Donnez à la chaîne une valeur nulle pour spécifier la couleur de fond par défaut actuelle.</para>
<para>Indique la couleur de fond pour l'affichage du fichier. La chaîne peut être dans le format « #RRGGBB» (comme retourné par <methodname>QColor::name()</methodname>) où «RR», «GG» et «BB» sont des valeurs hexadécimales à deux chiffres pour «red» (rouge), «green» (vert) et «blue» (bleu). Sinon, la chaîne peut être dans n'importe lequel des autres formats acceptés par <methodname>QColor::setNamedColor()</methodname>, comme un nom tiré de la base de données des couleurs X (&pex; «red» (rouge) ou «steelblue» (bleu acier). Donnez à la chaîne une valeur nulle pour spécifier la couleur de fond par défaut actuelle.</para>
<para>Indique la couleur de fond pour l'affichage du fichier. La chaîne peut être dans le format « #RRGGBB» (comme retourné par <methodname>TQColor::name()</methodname>) où «RR», «GG» et «BB» sont des valeurs hexadécimales à deux chiffres pour «red» (rouge), «green» (vert) et «blue» (bleu). Sinon, la chaîne peut être dans n'importe lequel des autres formats acceptés par <methodname>TQColor::setNamedColor()</methodname>, comme un nom tiré de la base de données des couleurs X (&pex; «red» (rouge) ou «steelblue» (bleu acier). Donnez à la chaîne une valeur nulle pour spécifier la couleur de fond par défaut actuelle.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2133,29 +2133,29 @@
<refpurpose>programme une nouvelle alarme qui exécute une commande shell.</refpurpose>
<refpurpose>programme une nouvelle alarme qui exécute une commande shell.</refpurpose>
<para><function>hastodo(QString nom_de_la_tâche)</function> est un appel &DCOP; qui recherche une tâche portant un nom précis. Si ce nom est trouvé, un UID iCalendar est renvoyé pour identifier cette tâche. Sinon, une chaîne vide est renvoyée. </para>
<para><function>hastodo(TQString nom_de_la_tâche)</function> est un appel &DCOP; qui recherche une tâche portant un nom précis. Si ce nom est trouvé, un UID iCalendar est renvoyé pour identifier cette tâche. Sinon, une chaîne vide est renvoyée. </para>
<para>C'est dans le fichier iCalendar utilisé actuellement par &karm; que la recherche est faites. Elle porte sur toute l'arborescence, pas seulement sur les tâches principales. Si plusieurs tâches correspondent, c'est la première trouvée qui est renvoyée.</para>
<para>C'est dans le fichier iCalendar utilisé actuellement par &karm; que la recherche est faites. Elle porte sur toute l'arborescence, pas seulement sur les tâches principales. Si plusieurs tâches correspondent, c'est la première trouvée qui est renvoyée.</para>
<para><function>addtodo(QString tâche_à_faire)</function> est un appel &DCOP; qui ajoute une tâche principale au fichier en cours d'utilisation. L'UID de la nouvelle tâche est renvoyé. </para>
<para><function>addtodo(TQString tâche_à_faire)</function> est un appel &DCOP; qui ajoute une tâche principale au fichier en cours d'utilisation. L'UID de la nouvelle tâche est renvoyé. </para>
<para>Le modèle d'imagerie bas niveau de Qt est basé sur les possibilités fournies par X11 et d'autres systèmes de fenêtrage pour lesquels des ports Qt existent. Mais il les étend également en implémentant des fonctionnalités additionnelles telles que les transformations affines arbitraires pour le texte et les pixmaps. </para>
<para>Le modèle d'imagerie bas niveau de Qt est basé sur les possibilités fournies par X11 et d'autres systèmes de fenêtrage pour lesquels des ports Qt existent. Mais il les étend également en implémentant des fonctionnalités additionnelles telles que les transformations affines arbitraires pour le texte et les pixmaps. </para>
<para>La classe graphique centrale pour le dessin en 2D avec Qt est <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Elle peut dessiner sur un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Il y a trois périphériques de dessin possibles implémentés: l'un est <ulink url="kdeapi:qt/QWidget">QWidget</ulink> qui représente un widget sur l'écran. Le deuxième est <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> qui représente une imprimante et produit une sortie Postscript. Le troisième est la classe <ulink url="kdeapi:qt/QPicture">QPicture</ulink> qui enregistre les commandes de dessin, peut les enregistrer sur disque et les lire plus tard. Un format possible de stockage pour le dessin est le standard SVG du W3C. </para>
<para>La classe graphique centrale pour le dessin en 2D avec Qt est <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Elle peut dessiner sur un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Il y a trois périphériques de dessin possibles implémentés: l'un est <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink> qui représente un widget sur l'écran. Le deuxième est <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> qui représente une imprimante et produit une sortie Postscript. Le troisième est la classe <ulink url="kdeapi:qt/QPicture">QPicture</ulink> qui enregistre les commandes de dessin, peut les enregistrer sur disque et les lire plus tard. Un format possible de stockage pour le dessin est le standard SVG du W3C. </para>
<para>Il est donc possible de réutiliser le code de rendu pour afficher un widget pour l'impression, avec les mêmes fonctionnalités prises en charge. Bien sûr, en pratique, le code est utilisé dans un contexte légèrement différent. Le dessin sur un widget est presque exclusivement exécuté dans la méthode paintEvent() d'une classe de widget. </para>
<para>Il est donc possible de réutiliser le code de rendu pour afficher un widget pour l'impression, avec les mêmes fonctionnalités prises en charge. Bien sûr, en pratique, le code est utilisé dans un contexte légèrement différent. Le dessin sur un widget est presque exclusivement exécuté dans la méthode paintEvent() d'une classe de widget. </para>
<para>QBrush::QBrush(BrushStyle)—crée une brosse noire avec un des motifs par défaut illustrés ci-dessous.</para>
<para>QBrush::QBrush(BrushStyle)—crée une brosse noire avec un des motifs par défaut illustrés ci-dessous.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, BrushStyle)—crée une brosse colorée avec un des motifs illustrés ci-dessous.</para>
<para>QBrush::QBrush(const TQColor &, BrushStyle)—crée une brosse colorée avec un des motifs illustrés ci-dessous.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, const QPixmap)—crée une brosse colorée avec le motif personnalisé que vous indiquez comme second paramètre.</para>
<para>QBrush::QBrush(const TQColor &, const QPixmap)—crée une brosse colorée avec le motif personnalisé que vous indiquez comme second paramètre.</para>
<para>Les couleurs jouent un rôle à la fois lors de la frappe des courbes et lors du remplissage des formes. Dans Qt, les couleurs sont représentées par la classe <ulink url="kdeapi:qt/QColor">QColor</ulink>. Qt ne prend en charge aucune fonctionnalité graphique avancée comme les profils de couleur ICC (<emphasis>International Color Consortium</emphasis>) et la correction des couleurs. Les couleurs sont habituellement construites en spécifiant leurs composantes rouge, verte et bleue, puisque le modèle RVB est la manière dont sont composés les pixels sur un moniteur. </para>
<para>Les couleurs jouent un rôle à la fois lors de la frappe des courbes et lors du remplissage des formes. Dans Qt, les couleurs sont représentées par la classe <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. Qt ne prend en charge aucune fonctionnalité graphique avancée comme les profils de couleur ICC (<emphasis>International Color Consortium</emphasis>) et la correction des couleurs. Les couleurs sont habituellement construites en spécifiant leurs composantes rouge, verte et bleue, puisque le modèle RVB est la manière dont sont composés les pixels sur un moniteur. </para>
<para>Il est également possible d'utiliser une teinte, une saturation et une valeur. Cette représentation HSV est ce dont vous vous servez dans la boîte des couleurs Gtk, &pex; dans Le GIMP. Ici, la teinte correspond à l'angle sur la roue de couleurs, alors que la saturation correspond à la distance depuis le centre du cercle. La valeur peut être choisie avec un curseur séparé. </para>
<para>Il est également possible d'utiliser une teinte, une saturation et une valeur. Cette représentation HSV est ce dont vous vous servez dans la boîte des couleurs Gtk, &pex; dans Le GIMP. Ici, la teinte correspond à l'angle sur la roue de couleurs, alors que la saturation correspond à la distance depuis le centre du cercle. La valeur peut être choisie avec un curseur séparé. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corrrespond directement aux objets pixmaps dans X11. Les pixmaps sont des objets côté serveur et peuvent—sur une carte graphique moderne—même être enregistrés directement dans la mémoire de la carte. Ce comportement la rend <emphasis>très</emphasis> efficace pour transférer les pixmaps à l'écran. Les pixmaps agissent aussi comme l'équivalent d'un hors-écran de widgets—la classe QPixmap étant une sous-classe de QPaintDevice, vous pouvez dessiner dessus avec un QPainter. Les opérations de dessin élémentaires sont habituellement accélérées par les cartes graphiques modernes. Par conséquent, un motif d'usage courant est d'utiliser les pixmaps pour le double tamponnement. Cela signifie que, au lieu de peindre directement sur un widget, vous peignez sur un objet pixmap temporaire et que vous employez la fonction <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> pour transférer le pixmap au widget. Pour des retraçages complexes, cette astuce permet d'éviter le papillottement. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corrrespond directement aux objets pixmaps dans X11. Les pixmaps sont des objets côté serveur et peuvent—sur une carte graphique moderne—même être enregistrés directement dans la mémoire de la carte. Ce comportement la rend <emphasis>très</emphasis> efficace pour transférer les pixmaps à l'écran. Les pixmaps agissent aussi comme l'équivalent d'un hors-écran de widgets—la classe QPixmap étant une sous-classe de QPaintDevice, vous pouvez dessiner dessus avec un QPainter. Les opérations de dessin élémentaires sont habituellement accélérées par les cartes graphiques modernes. Par conséquent, un motif d'usage courant est d'utiliser les pixmaps pour le double tamponnement. Cela signifie que, au lieu de peindre directement sur un widget, vous peignez sur un objet pixmap temporaire et que vous employez la fonction <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> pour transférer le pixmap au widget. Pour des retraçages complexes, cette astuce permet d'éviter le papillottement. </para>
<para>En revanche, les objets <ulink url="kdeapi:qt/QImage">QImage</ulink> résident côté client. Ils se distinguent en fournissant un accès direct aux pixels de l'image. Ce comportement explique leur utilisation dans la manipulation des images, ainsi que les tâches comme le chargement et l'enregistrement sur disque (la méthode load() de QPixmap considère QImage comme une étape intermédiaire). Par ailleurs, le traçage d'une image sur un widget est une opération relativement coûteuse car elle implique un transfert vers le serveur X qui peut prendre du temps, en particulier pour les images de grandes dimensions et pour les serveurs distants. En fonction de la profondeur de couleur, la conversion de QImage en QPixmap peut aussi exiger un tramage. </para>
<para>En revanche, les objets <ulink url="kdeapi:qt/TQImage">TQImage</ulink> résident côté client. Ils se distinguent en fournissant un accès direct aux pixels de l'image. Ce comportement explique leur utilisation dans la manipulation des images, ainsi que les tâches comme le chargement et l'enregistrement sur disque (la méthode load() de QPixmap considère TQImage comme une étape intermédiaire). Par ailleurs, le traçage d'une image sur un widget est une opération relativement coûteuse car elle implique un transfert vers le serveur X qui peut prendre du temps, en particulier pour les images de grandes dimensions et pour les serveurs distants. En fonction de la profondeur de couleur, la conversion de TQImage en QPixmap peut aussi exiger un tramage. </para>
<para>Le texte peut être tracé avec une des variantes saturées de la méthode QPainter::drawText(). Celles-ci dessinent une QString soit à un point donné, soit dans un rectangle donné, en utilisant la police définie par QPainter::setFont(). Il y a également un paramètre qui prend une combinaison OU exclusif de certaines drapeaux à partir des énumérations <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> et <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>Le texte peut être tracé avec une des variantes saturées de la méthode QPainter::drawText(). Celles-ci dessinent une TQString soit à un point donné, soit dans un rectangle donné, en utilisant la police définie par QPainter::setFont(). Il y a également un paramètre qui prend une combinaison OU exclusif de certaines drapeaux à partir des énumérations <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> et <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>En commençant par la version3.0, Qt tient compte de la disposition complète du texte, même pour les langues qui s'écrivent de droite à gauche. </para>
<para>En commençant par la version3.0, Qt tient compte de la disposition complète du texte, même pour les langues qui s'écrivent de droite à gauche. </para>
<para>En plus des lignes habituelles, cet exemple explique comment déclarer qu'un service a certaines propriétés. Chaque définition de propriété correspond à un groupe <literal>[PropertyDef::name]</literal> dans le fichier de configuration. Dans ce groupe, la ligne <literal>Type</literal> déclare le type de la propriété. Les types possibles sont tout ce qui peut être enregistré dans une <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>En plus des lignes habituelles, cet exemple explique comment déclarer qu'un service a certaines propriétés. Chaque définition de propriété correspond à un groupe <literal>[PropertyDef::name]</literal> dans le fichier de configuration. Dans ce groupe, la ligne <literal>Type</literal> déclare le type de la propriété. Les types possibles sont tout ce qui peut être enregistré dans une <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Une fois l'objet <classname>KService</classname> en main, vous pouvez très simplement charger la bibliothèque et obtenir un pointeur vers son objet fabrique: </para>
<para>Une fois l'objet <classname>KService</classname> en main, vous pouvez très simplement charger la bibliothèque et obtenir un pointeur vers son objet fabrique: </para>
if (!client->isApplicationRegistered("tdeio_uiserver")) {
if (!client->isApplicationRegistered("tdeio_uiserver")) {
QString error;
TQString error;
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
cout << "Le démarrage de kioserver a échoué avec le message " << error << endl;
cout << "Le démarrage de kioserver a échoué avec le message " << error << endl;
}
}
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>Dans l'exemple donné ici, le service a été démarré «par nom», &cad; que le premier argument vers <function>TDEApplication::startServiceByName()</function> est le nom qui apparaît dans la ligne <literal>Name</literal> du fichier desktop. Une alternative consiste à utiliser <function>TDEApplication::startServiceByDesktopName()</function>, qui prend le nom de fichier de son fichier desktop comme argument, &cad; dans ce cas, <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Dans l'exemple donné ici, le service a été démarré «par nom», &cad; que le premier argument vers <function>TDEApplication::startServiceByName()</function> est le nom qui apparaît dans la ligne <literal>Name</literal> du fichier desktop. Une alternative consiste à utiliser <function>TDEApplication::startServiceByDesktopName()</function>, qui prend le nom de fichier de son fichier desktop comme argument, &cad; dans ce cas, <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Tous ces appels prennent une liste d'URL comme deuxième argument, fourni au service sur la ligne de commande. Le troisième argument est un pointeur vers une <classname>QString</classname>. Si le démarrage du service échoue, cet argument devient un message d'erreur traduit. </para>
<para>Tous ces appels prennent une liste d'URL comme deuxième argument, fourni au service sur la ligne de commande. Le troisième argument est un pointeur vers une <classname>TQString</classname>. Si le démarrage du service échoue, cet argument devient un message d'erreur traduit. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Bien sûr, même KMimeMagic n'est capable de déterminer un type de fichier qu'à partir du contenu d'un fichier local. Pour les fichiers distants, il y a une autre possibilité: </para>
<para>Bien sûr, même KMimeMagic n'est capable de déterminer un type de fichier qu'à partir du contenu d'un fichier local. Pour les fichiers distants, il y a une autre possibilité: </para>
<listitem><para>Il lookahead negativo impedisce una potenziale corrispondenza se la parte seguente della stringa in esame non corrisponde al <emphasis>MODELLO</emphasis>.</para>
<listitem><para>Il lookahead negativo impedisce una potenziale corrispondenza se la parte seguente della stringa in esame non corrisponde al <emphasis>MODELLO</emphasis>.</para>
<para>L'espressione <userinput>const \w+\b(?!\s*&)</userinput> corrisponde a <quote>const char</quote> nella stringa <quote>const char* foo</quote> mentre non corrisponde a <quote>const QString</quote> in <quote>const QString& bar</quote> perché <quote>&</quote> corrisponde al modello dell'asserzione di lookahead negativo.</para>
<para>L'espressione <userinput>const \w+\b(?!\s*&)</userinput> corrisponde a <quote>const char</quote> nella stringa <quote>const char* foo</quote> mentre non corrisponde a <quote>const TQString</quote> in <quote>const TQString& bar</quote> perché <quote>&</quote> corrisponde al modello dell'asserzione di lookahead negativo.</para>
if (!(c->send(KSplashName, "KSplashIface", "programStarted(QString,QString,QString)", data))
if (!(c->send(KSplashName, "KSplashIface", "programStarted(TQString,TQString,TQString)", data))
{
{
// Processamento degli errori qui .
// Processamento degli errori qui .
}
}
@ -596,7 +596,7 @@ X-KSplash-ObjectName=Theme2k
<listitem><para>Le classi dei plugin devono avere una funzione <literal>static</literal> chiamata <function>names</function> che ritorna una lista di nomi attraverso i quali possono essere invocate.</para></listitem>
<listitem><para>Le classi dei plugin devono avere una funzione <literal>static</literal> chiamata <function>names</function> che ritorna una lista di nomi attraverso i quali possono essere invocate.</para></listitem>
<listitem><para>Se il plugin può essere configurato nel modulo del centro di controllo, dovrebbe provvedere una classe basata su <literal>ThemeEngineConfig </literal> per la configurazione.</para></listitem>
<listitem><para>Se il plugin può essere configurato nel modulo del centro di controllo, dovrebbe provvedere una classe basata su <literal>ThemeEngineConfig </literal> per la configurazione.</para></listitem>
<listitem><para>Le classi dei plugin devono sovrascrivere almeno una delle seguenti funzioni <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> per renderle funzionanti.</para></listitem>
<listitem><para>Le classi dei plugin devono sovrascrivere almeno una delle seguenti funzioni <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> per renderle funzionanti.</para></listitem>
<listitem><para>Il costruttore deve prendere la forma <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> di modo che possa essere usato con la classe <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Il costruttore deve prendere la forma <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> di modo che possa essere usato con la classe <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>L'ultima richiesta può sembrare complicata ma, come vedremo dopo, aggiungendo una singola linea al tuo file sorgente, puoi ignorarla.</para>
<para>L'ultima richiesta può sembrare complicata ma, come vedremo dopo, aggiungendo una singola linea al tuo file sorgente, puoi ignorarla.</para>
</sect1>
</sect1>
@ -629,11 +629,11 @@ class Theme2k: public ThemeEngine
<para>Analizziamo il listato precedente. La classe <classname>Theme2k</classname> soddisfa la convenzione di nomi voluta, ed è ereditata dalla classe <classname>ThemeEngine</classname>. Fornisce un metodo <methodname>Theme2k::names()</methodname>, ed ha un costruttore che prende i parametri richiesti: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> e fornisce un semplice metodo <methodname>Theme2k::slotSetText()</methodname>. Per il momento non dobbiamo preoccuparci della classe <classname>RotWidget</classname>. Si tratta di un piccolo widget che fornisce alcuni effetti grafici. Il nostro plugin è molto semplice e non mostra icone o barre di progresso. Se vuoi mostrare delle icone devi overloadare la funzione <function>slotSetPixmap </function>. Funzioni simili esistono per impostare l'intervallo della barra di progresso (<function>slotUpdateSteps</function>) e incrementare il passo corrente (<function>slotUpdateProgress</function>). </para>
<para>Analizziamo il listato precedente. La classe <classname>Theme2k</classname> soddisfa la convenzione di nomi voluta, ed è ereditata dalla classe <classname>ThemeEngine</classname>. Fornisce un metodo <methodname>Theme2k::names()</methodname>, ed ha un costruttore che prende i parametri richiesti: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> e fornisce un semplice metodo <methodname>Theme2k::slotSetText()</methodname>. Per il momento non dobbiamo preoccuparci della classe <classname>RotWidget</classname>. Si tratta di un piccolo widget che fornisce alcuni effetti grafici. Il nostro plugin è molto semplice e non mostra icone o barre di progresso. Se vuoi mostrare delle icone devi overloadare la funzione <function>slotSetPixmap </function>. Funzioni simili esistono per impostare l'intervallo della barra di progresso (<function>slotUpdateSteps</function>) e incrementare il passo corrente (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementazione dei plugin</title>
<title>Implementazione dei plugin</title>
@ -682,7 +682,7 @@ private:
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> è dichiarata in <filename>kgenericfactory.h</filename>. E ora il costruttore! Dato che questo plugin è super semplice, il costruttore è alquanto semplice.</para>
<para>La macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> è dichiarata in <filename>kgenericfactory.h</filename>. E ora il costruttore! Dato che questo plugin è super semplice, il costruttore è alquanto semplice.</para>
<para>L'interfaccia <abbrev>DCOP</abbrev> di &kstars; include le seguenti funzioni: <itemizedlist>
<para>L'interfaccia <abbrev>DCOP</abbrev> di &kstars; include le seguenti funzioni: <itemizedlist>
<listitem><para><function> lookTowards( cost QString direzione)</function>: punta il display nella direzione specificata dall'argomento. Può trattarsi del nome di un qualsiasi oggetto celeste, o di una delle seguenti parole o abbreviazioni: zenith (o z), per lo zenit, north (n) per il nord, northeast (ne) per il nordest, east (e) per l'est, southeast (se) per il sudest, south (s) per il sud, southwest(sw) per il sudovest, west(w) per l'ovest, northwest (nw) per il nordovest. </para></listitem>
<listitem><para><function> lookTowards( cost TQString direzione)</function>: punta il display nella direzione specificata dall'argomento. Può trattarsi del nome di un qualsiasi oggetto celeste, o di una delle seguenti parole o abbreviazioni: zenith (o z), per lo zenit, north (n) per il nord, northeast (ne) per il nordest, east (e) per l'est, southeast (se) per il sudest, south (s) per il sud, southwest(sw) per il sudovest, west(w) per l'ovest, northwest (nw) per il nordovest. </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: centra il display sulle coordinate equatoriali specificate. </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: centra il display sulle coordinate equatoriali specificate. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: attende t secondi prima di continuare con i comandi successivi. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: attende t secondi prima di continuare con i comandi successivi. </para></listitem>
<listitem><para><function> waitForKey( cost QString k )</function>: arresta l'esecuzione dello script fino a quando l'utente non preme il tasto specificato. Attualmente non è possibile specificare una combinazione di tasti (come <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); limitati a usare tasti semplici. Puoi digitare <quote>space</quote> per indicare la barra spaziatrice. </para></listitem>
<listitem><para><function> waitForKey( cost TQString k )</function>: arresta l'esecuzione dello script fino a quando l'utente non preme il tasto specificato. Attualmente non è possibile specificare una combinazione di tasti (come <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); limitati a usare tasti semplici. Puoi digitare <quote>space</quote> per indicare la barra spaziatrice. </para></listitem>
<listitem><para><function> changeViewOption( cost QString opzione, cost QString valore )</function>: modifica un'opzione di visualizzazione. Ci sono decine di opzioni disponibili; praticamente tutto ciò che si può cambiare nella finestra <guilabel>Configura &kstars;</guilabel> può essere cambiato anche qui. Il primo argomento è il nome dell'opzione (i nomi sono presi dal file di configurazione <filename>kstarsrc</filename>), e il secondo è il valore desiderato. L'interprete degli argomenti è stato progettato per essere robusto, quindi dovrebbe arrestarsi senza conseguenze qualora riceva dati non validi. </para></listitem>
<listitem><para><function> changeViewOption( cost TQString opzione, cost TQString valore )</function>: modifica un'opzione di visualizzazione. Ci sono decine di opzioni disponibili; praticamente tutto ciò che si può cambiare nella finestra <guilabel>Configura &kstars;</guilabel> può essere cambiato anche qui. Il primo argomento è il nome dell'opzione (i nomi sono presi dal file di configurazione <filename>kstarsrc</filename>), e il secondo è il valore desiderato. L'interprete degli argomenti è stato progettato per essere robusto, quindi dovrebbe arrestarsi senza conseguenze qualora riceva dati non validi. </para></listitem>
<listitem><para><function> setGeoLocation( cost QString città, cost QString provincia, cost QString nazione )</function>: imposta la città specificata come località di osservazione. Se non viene trovata alcuna città corrispondente agli argomenti, il comando è ignorato. </para></listitem>
<listitem><para><function> setGeoLocation( cost TQString città, cost TQString provincia, cost TQString nazione )</function>: imposta la città specificata come località di osservazione. Se non viene trovata alcuna città corrispondente agli argomenti, il comando è ignorato. </para></listitem>
<listitem><para><function> stop()</function> [orologio]: arresta l'orologio della simulazione. </para></listitem>
<listitem><para><function> stop()</function> [orologio]: arresta l'orologio della simulazione. </para></listitem>
<listitem><para>Funzioni generiche di periferica: hanno lo scopo di accendere/spegnere periferiche, e così via...</para>
<listitem><para>Funzioni generiche di periferica: hanno lo scopo di accendere/spegnere periferiche, e così via...</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString nomePeriferica, bool usaLocale)</function>: avvia un servizio INDI in modalità locale o server.</para></listitem>
<listitem><para><function>startINDI (TQString nomePeriferica, bool usaLocale)</function>: avvia un servizio INDI in modalità locale o server.</para></listitem>
<listitem><para><function>shutdownINDI (QString nomePeriferica)</function>: arresta un servizio INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString nomePeriferica)</function>: arresta un servizio INDI.</para></listitem>
<listitem><para><function>switchINDI(QString nomePeriferica, bool accesoSpento)</function>: connette o disconnette una periferica INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString nomePeriferica, bool accesoSpento)</function>: connette o disconnette una periferica INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString nomePeriferica, QString porta)</function>: imposta la porta di connessione della periferica.</para></listitem>
<listitem><para><function>setINDIPort(TQString nomePeriferica, TQString porta)</function>: imposta la porta di connessione della periferica.</para></listitem>
<listitem><para><function>setINDIAction(QString nomePeriferica, QString azione)</function>: attiva un'azione INDI. L'azione può essere un <emphasis>elemento</emphasis> qualsiasi di una <emphasis>proprietà interruttore</emphasis>.</para></listitem>
<listitem><para><function>setINDIAction(TQString nomePeriferica, TQString azione)</function>: attiva un'azione INDI. L'azione può essere un <emphasis>elemento</emphasis> qualsiasi di una <emphasis>proprietà interruttore</emphasis>.</para></listitem>
<listitem><para><function>waitForINDIAction(QString nomePeriferica, QString azione)</function>: arresta l'esecuzione dello script fino a quando la <emphasis>proprietà</emphasis> dell'azione specificata restituisce uno stato OK.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString nomePeriferica, TQString azione)</function>: arresta l'esecuzione dello script fino a quando la <emphasis>proprietà</emphasis> dell'azione specificata restituisce uno stato OK.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funzioni telescopio: servono a controllare il movimento e lo stato del telescopio.</para>
<listitem><para>Funzioni telescopio: servono a controllare il movimento e lo stato del telescopio.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString nomePeriferica, QString azione)</function>: imposta la modalità o l'azione del telescopio. Le opzioni disponibili sono SLEW, TRACK, SYNC, PARK e ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString nomePeriferica, TQString azione)</function>: imposta la modalità o l'azione del telescopio. Le opzioni disponibili sono SLEW, TRACK, SYNC, PARK e ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString nomePeriferica, double AR, double DEC)</function>: imposta le coordinate JNow del telescopio ai valori <emphasis>AR</emphasis> e <emphasis>DEC</emphasis> specificati.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString nomePeriferica, double AR, double DEC)</function>: imposta le coordinate JNow del telescopio ai valori <emphasis>AR</emphasis> e <emphasis>DEC</emphasis> specificati.</para></listitem>
<listitem><para><function>setINDITargetName(QString nomePeriferica, QString nomeOggetto)</function>: imposta le coordinate JNow del telescopio a quelle di <emphasis>nomeOggetto</emphasis>. KStars cercherà l'oggetto nel proprio database e ne utilizzerà le coordinate.</para></listitem>
<listitem><para><function>setINDITargetName(TQString nomePeriferica, TQString nomeOggetto)</function>: imposta le coordinate JNow del telescopio a quelle di <emphasis>nomeOggetto</emphasis>. KStars cercherà l'oggetto nel proprio database e ne utilizzerà le coordinate.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString nomePeriferica, double longitudine, double latitudine)</function>: imposta la località geografica del telescopio alla latitudine e longitudine specificate. La longitudine è calcolata da Greenwich, Regno Unito, verso est. Tuttavia, sebbene sia comune utilizzare longitudini negative per l'emisfero occidentale, INDI richiede valori di longitudine tra 0 e 360 gradi. Perciò, se hai una longitudine negativa, è sufficiente aggiungere 360 gradi per ottenere il valore che INDI si aspetta. Per esempio, le coordinate di Calgary, Canada, in &kstars; sono longitudine -114 04 58 e latitudine 51 02 58. Perciò a INDI va fornita la longitudine 360 - 114,083 = 245,917 gradi.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString nomePeriferica, double longitudine, double latitudine)</function>: imposta la località geografica del telescopio alla latitudine e longitudine specificate. La longitudine è calcolata da Greenwich, Regno Unito, verso est. Tuttavia, sebbene sia comune utilizzare longitudini negative per l'emisfero occidentale, INDI richiede valori di longitudine tra 0 e 360 gradi. Perciò, se hai una longitudine negativa, è sufficiente aggiungere 360 gradi per ottenere il valore che INDI si aspetta. Per esempio, le coordinate di Calgary, Canada, in &kstars; sono longitudine -114 04 58 e latitudine 51 02 58. Perciò a INDI va fornita la longitudine 360 - 114,083 = 245,917 gradi.</para></listitem>
<listitem><para><function>setINDIUTC(QString nomePeriferica, QString dataOraUTC)</function>: imposta la data e l'ora UTC del telescopio in formato ISO 8601. Il formato è AAAA-MM-GGTHH:MM:SS (per esempio 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString nomePeriferica, TQString dataOraUTC)</function>: imposta la data e l'ora UTC del telescopio in formato ISO 8601. Il formato è AAAA-MM-GGTHH:MM:SS (per esempio 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funzioni videocamera/CCD: permettono di controllare le proprietà e lo stato della videocamera o del CCD.</para>
<listitem><para>Funzioni videocamera/CCD: permettono di controllare le proprietà e lo stato della videocamera o del CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString nomePeriferica, int temp)</function>: imposta la temperatura del chip CCD in gradi Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString nomePeriferica, int temp)</function>: imposta la temperatura del chip CCD in gradi Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString nomePeriferica, QString tipo)</function>: imposta il tipo di frame del CCD. Le opzioni disponibili sono FRAME_LIGHT, FRAME_BIAS, FRAME_DARK e FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString nomePeriferica, TQString tipo)</function>: imposta il tipo di frame del CCD. Le opzioni disponibili sono FRAME_LIGHT, FRAME_BIAS, FRAME_DARK e FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString nomePeriferica, int durata)</function>: avvia l'esposizione del CCD/videocamera per la durata specificata dal parametro omonimo, in secondi.</para></listitem>
<listitem><para><function>startINDIExposure(TQString nomePeriferica, int durata)</function>: avvia l'esposizione del CCD/videocamera per la durata specificata dal parametro omonimo, in secondi.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funzioni focheggiatore: servono a controllare il movimento e lo stato del focheggiatore.</para>
<listitem><para>Funzioni focheggiatore: servono a controllare il movimento e lo stato del focheggiatore.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString nomePeriferica, QString azione)</function>: imposta la velocità del focheggiatore. Le opzioni disponibili sono FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM e FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString nomePeriferica, TQString azione)</function>: imposta la velocità del focheggiatore. Le opzioni disponibili sono FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM e FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString nomePeriferica, int durata)</function>: imposta la durata in secondi di ogni operazione startINDIFocus successiva.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString nomePeriferica, int durata)</function>: imposta la durata in secondi di ogni operazione startINDIFocus successiva.</para></listitem>
<listitem><para><function>startINDIFocus(QString nomePeriferica, int dirFuoco)</function>: sposta il focheggiatore verso l'interno (dirFuoco = 0) o l'esterno (dirFuoco = 1). La velocità e durata di questa operazione sono impostate tramite le funzioni <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString nomePeriferica, int dirFuoco)</function>: sposta il focheggiatore verso l'interno (dirFuoco = 0) o l'esterno (dirFuoco = 1). La velocità e durata di questa operazione sono impostate tramite le funzioni <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funzioni filtro: servono a controllare la posizione del filtro.</para>
<listitem><para>Funzioni filtro: servono a controllare la posizione del filtro.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString nomePeriferica, int num_filtro)</function>: modifica la posizione del filtro a <varname>num_filtro</varname>. L'utente può assegnare nomi ai numeri dei filtri nella finestra <guimenuitem>Configura INDI</guimenuitem> nel menu <guimenu>Periferiche</guimenu> (per esempio, Filtro 1 = Rosso, Filtro 2 = Verde... eccetera).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString nomePeriferica, int num_filtro)</function>: modifica la posizione del filtro a <varname>num_filtro</varname>. L'utente può assegnare nomi ai numeri dei filtri nella finestra <guimenuitem>Configura INDI</guimenuitem> nel menu <guimenu>Periferiche</guimenu> (per esempio, Filtro 1 = Rosso, Filtro 2 = Verde... eccetera).</para></listitem>
<para>Puoi ottenere un elenco di tutte le interfacce &DCOP; disponibili usando gli argomenti giusti, come mostrato in questo esempio: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Puoi ottenere un elenco di tutte le interfacce &DCOP; disponibili usando gli argomenti giusti, come mostrato in questo esempio: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
@ -1898,7 +1898,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>colore_sfondo</parameter></term>
<term><parameter>colore_sfondo</parameter></term>
<listitem>
<listitem>
<para>Specifica il colore di sfondo con cui visualizzare il messaggio. La stringa può essere nel formato <quote>#RRVVBB</quote> (come restituito da <methodname>QColor::name()</methodname>), dove RR, VV e BB sono valori esadecimali di due cifre di rosso, verde e blu. In alternativa, la stringa può essere in uno qualsiasi dei formati accettati da <methodname>QColor::setNamedColor()</methodname>, come un nome dei colori di X (per esempio <quote>red</quote> o <quote>steelblue</quote>). Imposta una stringa nulla per specificare l'attuale colore di sfondo predefinito.</para>
<para>Specifica il colore di sfondo con cui visualizzare il messaggio. La stringa può essere nel formato <quote>#RRVVBB</quote> (come restituito da <methodname>TQColor::name()</methodname>), dove RR, VV e BB sono valori esadecimali di due cifre di rosso, verde e blu. In alternativa, la stringa può essere in uno qualsiasi dei formati accettati da <methodname>TQColor::setNamedColor()</methodname>, come un nome dei colori di X (per esempio <quote>red</quote> o <quote>steelblue</quote>). Imposta una stringa nulla per specificare l'attuale colore di sfondo predefinito.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2000,21 +2000,21 @@ continuously in the background and alarms are always enabled.</para>
@ -2067,7 +2067,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>colore_sfondo</parameter></term>
<term><parameter>colore_sfondo</parameter></term>
<listitem>
<listitem>
<para>Specifica il colore di sfondo con cui visualizzare il file. La stringa può essere nel formato <quote>#RRVVBB</quote> (come restituito da <methodname>QColor::name()</methodname>), dove RR, VV e BB sono valori esadecimali di due cifre di rosso, verde e blu. In alternativa, la stringa può essere in uno qualsiasi dei formati accettati da <methodname>QColor::setNamedColor()</methodname>, come un nome dei colori di X (per esempio <quote>red</quote> o <quote>steelblue</quote>). Imposta una stringa nulla per specificare l'attuale colore di sfondo predefinito.</para>
<para>Specifica il colore di sfondo con cui visualizzare il file. La stringa può essere nel formato <quote>#RRVVBB</quote> (come restituito da <methodname>TQColor::name()</methodname>), dove RR, VV e BB sono valori esadecimali di due cifre di rosso, verde e blu. In alternativa, la stringa può essere in uno qualsiasi dei formati accettati da <methodname>TQColor::setNamedColor()</methodname>, come un nome dei colori di X (per esempio <quote>red</quote> o <quote>steelblue</quote>). Imposta una stringa nulla per specificare l'attuale colore di sfondo predefinito.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2153,29 +2153,29 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>pianifica un nuovo avviso che esegue un comando di shell.</refpurpose>
<refpurpose>pianifica un nuovo avviso che esegue un comando di shell.</refpurpose>
<refpurpose>Restituisce la versione di &karm;.</refpurpose>
<refpurpose>Restituisce la versione di &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString version()
<synopsis>TQString version()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -752,7 +752,7 @@ Generato il: 2004-07-13 18:10
<refpurpose>Restituisce l'uscita di &karm;.</refpurpose>
<refpurpose>Restituisce l'uscita di &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString quit()
<synopsis>TQString quit()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -770,7 +770,7 @@ Generato il: 2004-07-13 18:10
<refpurpose>Verifica che esista una cosa da fare principale.</refpurpose>
<refpurpose>Verifica che esista una cosa da fare principale.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString hastodo(QString taskname)
<synopsis>TQString hastodo(TQString taskname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>parametri</title>
<title>parametri</title>
@ -786,7 +786,7 @@ Generato il: 2004-07-13 18:10
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
<title>Descrizione</title>
<title>Descrizione</title>
<para><function>hastodo(QString taskname)</function> è una chiamata &DCOP; che cerca un'attività con il nome dato. Se la trova restituisce l'UID iCalendar che identifica quell'attività. Se non lo trova, restituisce una stringa vuota. </para>
<para><function>hastodo(TQString taskname)</function> è una chiamata &DCOP; che cerca un'attività con il nome dato. Se la trova restituisce l'UID iCalendar che identifica quell'attività. Se non lo trova, restituisce una stringa vuota. </para>
<para>Il file iCalendar che &karm; apre è il file che si è cercato. La funzione cerca in tutte le gerarchie delle attività, non solo nelle attività principali. Se più di una attività corrisponde alla ricerca solo la prima viene riportata.</para>
<para>Il file iCalendar che &karm; apre è il file che si è cercato. La funzione cerca in tutte le gerarchie delle attività, non solo nelle attività principali. Se più di una attività corrisponde alla ricerca solo la prima viene riportata.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -800,7 +800,7 @@ Generato il: 2004-07-13 18:10
<refpurpose>Una nuova attività.</refpurpose>
<refpurpose>Una nuova attività.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString todoname)
<synopsis>TQString addtodo(TQString todoname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>parametri</title>
<title>parametri</title>
@ -817,7 +817,7 @@ Generato il: 2004-07-13 18:10
<refsect1>
<refsect1>
<title>Descrizione</title>
<title>Descrizione</title>
<para><function>addtodo(QString todoname)</function> è una chiamata &DCOP; che aggiunge una nuova attività principale alle altre già presenti. Viene restituito l'UID della nuova attività. </para>
<para><function>addtodo(TQString todoname)</function> è una chiamata &DCOP; che aggiunge una nuova attività principale alle altre già presenti. Viene restituito l'UID della nuova attività. </para>
<para>Il secondo oggetto del nostro programma è il pulsante, una istanza della classe <classname>QPushButton</classname>. Tra i due costruttori che creano una istanza del pulsante verrà usato il secondo: esso accetta un testo, che è l'etichetta del pulsante; in questo caso è la stringa "Hello World!". Dopo si chiama il metodo <methodname>resize()</methodname> per modificare la dimensione del pulsante - il pulsante deve essere più largo per rendere la stringa completamente visibile. </para>
<para>Il secondo oggetto del nostro programma è il pulsante, una istanza della classe <classname>QPushButton</classname>. Tra i due costruttori che creano una istanza del pulsante verrà usato il secondo: esso accetta un testo, che è l'etichetta del pulsante; in questo caso è la stringa "Hello World!". Dopo si chiama il metodo <methodname>resize()</methodname> per modificare la dimensione del pulsante - il pulsante deve essere più largo per rendere la stringa completamente visibile. </para>
<para>Qual è lo scopo del metodo <methodname>show()</methodname>? Come la maggior parte dei widget, la classe <classname>QPushButton</classname> ha una singola ereditarietà e la sua classe base è <classname>QButton</classname>. Seguire il collegamento relativo alla classe <classname>QButton</classname>; verranno visualizzati molti altri widget che ereditano da <classname>QPushButton</classname>, che saranno illustrati in seguito per spiegare il meccanismo segnale/slot. Siccome il metodo <methodname>show()</methodname> non è elencato deve essere un metodo ereditato. La classe <classname>QButton</classname> eredita da <classname>QWidget</classname>. Seguendo nuovamente il collegamento saranno mostrati un gruppo di metodi forniti da quest'ultima classe, tra cui il metodo <methodname>show()</methodname>. Ora si può capire cosa accade nell'esempio: <orderedlist>
<para>Qual è lo scopo del metodo <methodname>show()</methodname>? Come la maggior parte dei widget, la classe <classname>QPushButton</classname> ha una singola ereditarietà e la sua classe base è <classname>QButton</classname>. Seguire il collegamento relativo alla classe <classname>QButton</classname>; verranno visualizzati molti altri widget che ereditano da <classname>QPushButton</classname>, che saranno illustrati in seguito per spiegare il meccanismo segnale/slot. Siccome il metodo <methodname>show()</methodname> non è elencato deve essere un metodo ereditato. La classe <classname>QButton</classname> eredita da <classname>TQWidget</classname>. Seguendo nuovamente il collegamento saranno mostrati un gruppo di metodi forniti da quest'ultima classe, tra cui il metodo <methodname>show()</methodname>. Ora si può capire cosa accade nell'esempio: <orderedlist>
<listitem><para>Si crea una istanza di <classname>QPushButton</classname> usando il secondo costruttore in modo da impostare il testo del pulsante</para></listitem>
<listitem><para>Si crea una istanza di <classname>QPushButton</classname> usando il secondo costruttore in modo da impostare il testo del pulsante</para></listitem>
<listitem><para>Si ridimensiona il widget in base al suo contenuto</para></listitem>
<listitem><para>Si ridimensiona il widget in base al suo contenuto</para></listitem>
<listitem><para>Si imposta il widget come quello principale dell'istanza a della classe <classname>QApplication </classname></para></listitem>
<listitem><para>Si imposta il widget come quello principale dell'istanza a della classe <classname>QApplication </classname></para></listitem>
<listitem><para>Si indica al widget di mostrarsi sul video chiamando <methodname>show()</methodname>, un metodo derivato dalla classe <classname>QWidget</classname></para></listitem>
<listitem><para>Si indica al widget di mostrarsi sul video chiamando <methodname>show()</methodname>, un metodo derivato dalla classe <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Dopo aver chiamato il metodo <methodname>exec()</methodname> l'applicazione è visibile all'utente e mostra una finestra con il pulsante contente "Hello World!". Nota: I programmi GUI hanno un comportamento piuttosto diverso dalle applicazioni procedurali: l'applicazione entra nel cosiddetto "ciclo principale degli eventi" ("main event loop"), dove attende le azioni dell'utente e reagisce ad esse. Anche nelle applicazioni Qt il programma deve essere in questo ciclo per poter gestire gli eventi. La prossima sezione spiega brevemente cosa offrono le librerie Qt per la gestione degli eventi generati dell'utente. </para>
<para>Dopo aver chiamato il metodo <methodname>exec()</methodname> l'applicazione è visibile all'utente e mostra una finestra con il pulsante contente "Hello World!". Nota: I programmi GUI hanno un comportamento piuttosto diverso dalle applicazioni procedurali: l'applicazione entra nel cosiddetto "ciclo principale degli eventi" ("main event loop"), dove attende le azioni dell'utente e reagisce ad esse. Anche nelle applicazioni Qt il programma deve essere in questo ciclo per poter gestire gli eventi. La prossima sezione spiega brevemente cosa offrono le librerie Qt per la gestione degli eventi generati dell'utente. </para>
<note><para>Per gli utenti più esperti: il pulsante non ha la dichiarazione del genitore nel costruttore, quindi è un widget top-level e viene eseguito in un ciclo di eventi locale che non ha bisogno di attendere il ciclo principale degli eventi. Vedere la documentazione della classe QWidget e la guida di riferimento della libreria KDE</para>
<note><para>Per gli utenti più esperti: il pulsante non ha la dichiarazione del genitore nel costruttore, quindi è un widget top-level e viene eseguito in un ciclo di eventi locale che non ha bisogno di attendere il ciclo principale degli eventi. Vedere la documentazione della classe TQWidget e la guida di riferimento della libreria KDE</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Ora passiamo a dare "vita" all'applicazione elaborando gli eventi dell'utente. Generalmente l'utente ha due modi per interagire con un programma: il mouse e la tastiera. Per entrambi l'interfaccia grafica utente deve fornire metodi per intercettare le azioni e metodi che eseguono qualcosa in risposta a queste azioni. </para>
<para>Ora passiamo a dare "vita" all'applicazione elaborando gli eventi dell'utente. Generalmente l'utente ha due modi per interagire con un programma: il mouse e la tastiera. Per entrambi l'interfaccia grafica utente deve fornire metodi per intercettare le azioni e metodi che eseguono qualcosa in risposta a queste azioni. </para>
<para>Il sistema grafico invia tutti gli eventi di interazione all'applicazione corrispondente. La classe <classname>QApplication</classname> li invia alla finestra attiva come oggetti <classname>QEvent</classname> e i widget dovranno decidere cosa farne. Un widget riceve l'evento ed elabora <methodname>QWidget::event(QEvent*)</methodname>, il quale decide quale evento è stato eseguito e come reagire; <methodname>event()</methodname> è il gestore principale degli eventi. In seguito il metodo <methodname>event()</methodname> passa l'evento ai cosiddetti filtri di evento che determinano cosa è successo e cosa fare con l'evento. Se non esiste un filtro assegnato come responsabile per l'evento, saranno chiamati i gestori specializzati per quell'evento. Quindi possiamo decidere tra: <itemizedlist>
<para>Il sistema grafico invia tutti gli eventi di interazione all'applicazione corrispondente. La classe <classname>QApplication</classname> li invia alla finestra attiva come oggetti <classname>QEvent</classname> e i widget dovranno decidere cosa farne. Un widget riceve l'evento ed elabora <methodname>TQWidget::event(QEvent*)</methodname>, il quale decide quale evento è stato eseguito e come reagire; <methodname>event()</methodname> è il gestore principale degli eventi. In seguito il metodo <methodname>event()</methodname> passa l'evento ai cosiddetti filtri di evento che determinano cosa è successo e cosa fare con l'evento. Se non esiste un filtro assegnato come responsabile per l'evento, saranno chiamati i gestori specializzati per quell'evento. Quindi possiamo decidere tra: <itemizedlist>
<listitem><para>Eventi di tastiera -- tasti Tab e Shift-Tab:</para>
<listitem><para>Eventi di tastiera -- tasti Tab e Shift-Tab:</para>
<para>Notare che tutte le funzioni degli eventi sono virtuali e protette; quindi si possono reimplementare gli eventi per i propri widget e specificare come essi debbano rispondere. <classname>QWidget</classname> contiene inoltre qualche altro metodo virtuale che può essere utile nei programmi. </para>
<para>Notare che tutte le funzioni degli eventi sono virtuali e protette; quindi si possono reimplementare gli eventi per i propri widget e specificare come essi debbano rispondere. <classname>TQWidget</classname> contiene inoltre qualche altro metodo virtuale che può essere utile nei programmi. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Interazione degli oggetti attraverso segnali e slot</title>
<title>Interazione degli oggetti attraverso segnali e slot</title>
<para>Si è giunti al più ovvio vantaggio degli strumenti Qt: il meccanismo dei segnali e degli slot. Questi offrono una comoda soluzione all'interazione tra oggetti, che in X-Window viene normalmente risolta con funzioni di callback. Siccome questa comunicazione richiede una programmazione rigorosa e a volte rende la creazione di interfacce grafiche molto difficile (come riportato della documentazione Qt e dimostrato in Programming with Qt di K.Dalheimer), Troll Tech ha inventato un nuovo sistema, dove gli oggetti emettono segnali che possono essere connessi ai metodi dichiarati come slot. Il programmatore C++ deve solamente conoscere alcune cose riguardo questo meccanismo: <itemizedlist>
<para>Si è giunti al più ovvio vantaggio degli strumenti Qt: il meccanismo dei segnali e degli slot. Questi offrono una comoda soluzione all'interazione tra oggetti, che in X-Window viene normalmente risolta con funzioni di callback. Siccome questa comunicazione richiede una programmazione rigorosa e a volte rende la creazione di interfacce grafiche molto difficile (come riportato della documentazione Qt e dimostrato in Programming with Qt di K.Dalheimer), Troll Tech ha inventato un nuovo sistema, dove gli oggetti emettono segnali che possono essere connessi ai metodi dichiarati come slot. Il programmatore C++ deve solamente conoscere alcune cose riguardo questo meccanismo: <itemizedlist>
<listitem><para>la dichiarazione di una classe che usa i segnali e gli slot deve contenere la macro TQ_OBJECT all'inizio (senza il punto e virgola) e deve ereditare dalla classe <classname>QObject</classname> </para></listitem>
<listitem><para>la dichiarazione di una classe che usa i segnali e gli slot deve contenere la macro TQ_OBJECT all'inizio (senza il punto e virgola) e deve ereditare dalla classe <classname>TQObject</classname> </para></listitem>
<listitem><para>un segnale può essere emesso tramite la parola chiave emit, es: emit signal(parametri); dall'interno di qualunque membro di una classe che permette l'uso di segnali e slot </para></listitem>
<listitem><para>un segnale può essere emesso tramite la parola chiave emit, es: emit signal(parametri); dall'interno di qualunque membro di una classe che permette l'uso di segnali e slot </para></listitem>
<listitem><para>tutti i segnali utilizzati dalle classi che non sono ereditati devono essere aggiunti alla dichiarazione di classe in una sezione dedicata ai segnali </para></listitem>
<listitem><para>tutti i segnali utilizzati dalle classi che non sono ereditati devono essere aggiunti alla dichiarazione di classe in una sezione dedicata ai segnali </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>il compilatore per i meta-oggetti moc deve essere eseguito sul file di intestazione per espandere le macro e produrre l'implementazione (che non è necessario conoscere). I file di output dal moc saranno successivamente compilati anche dal compilatore C++. </para></listitem>
<listitem><para>il compilatore per i meta-oggetti moc deve essere eseguito sul file di intestazione per espandere le macro e produrre l'implementazione (che non è necessario conoscere). I file di output dal moc saranno successivamente compilati anche dal compilatore C++. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Un'altra strada per utilizzare i segnali senza derivare da <classname>QObject</classname> è utilizzare la classe <classname>QSignal</classname> - vedere la documentazione di riferimento per ulteriori informazioni ed esempi di utilizzo. Nel seguito si presuppone che si stia derivando dalla classe <classname>QObject</classname>. </para>
<para>Un'altra strada per utilizzare i segnali senza derivare da <classname>TQObject</classname> è utilizzare la classe <classname>QSignal</classname> - vedere la documentazione di riferimento per ulteriori informazioni ed esempi di utilizzo. Nel seguito si presuppone che si stia derivando dalla classe <classname>TQObject</classname>. </para>
<para>In questo modo la classe può inviare ovunque segnali ed avere degli slot a cui collegare tali segnali. Utilizzando i segnali non ci si deve preoccupare di chi li riceverà - si deve solo emettere il segnale e connettere un qualunque slot che risponderà all'evento. Inoltre gli slot possono essere utilizzati come normali metodi durante l'implementazione. </para>
<para>In questo modo la classe può inviare ovunque segnali ed avere degli slot a cui collegare tali segnali. Utilizzando i segnali non ci si deve preoccupare di chi li riceverà - si deve solo emettere il segnale e connettere un qualunque slot che risponderà all'evento. Inoltre gli slot possono essere utilizzati come normali metodi durante l'implementazione. </para>
<para>Per connettere un segnale ad uno slot si devono utilizzare i metodi <methodname>connect()</methodname> messi a disposizione dalla classe <classname>QObject</classname> o, quando disponibile, metodi speciali forniti dagli oggetti per impostare la connessione ad un determinato segnale. </para>
<para>Per connettere un segnale ad uno slot si devono utilizzare i metodi <methodname>connect()</methodname> messi a disposizione dalla classe <classname>TQObject</classname> o, quando disponibile, metodi speciali forniti dagli oggetti per impostare la connessione ad un determinato segnale. </para>
<para>Come si può vedere, l'unica modifica richiesta per dare maggiore interazione al pulsante consiste nell'utilizzare il metodo <methodname>connect()</methodname>: tutto quello che si deve aggiungere è <methodname>connect(&hello,SIGNAL( clicked() ), &a,SLOT( quit() ))</methodname>. Cosa significa? La dichiarazione del metodo <methodname>connect()</methodname> nella classe QObject è: </para>
<para>Come si può vedere, l'unica modifica richiesta per dare maggiore interazione al pulsante consiste nell'utilizzare il metodo <methodname>connect()</methodname>: tutto quello che si deve aggiungere è <methodname>connect(&hello,SIGNAL( clicked() ), &a,SLOT( quit() ))</methodname>. Cosa significa? La dichiarazione del metodo <methodname>connect()</methodname> nella classe TQObject è: </para>
<para>Si deve specificare come primo parametro un puntatore ad una istanza di <classname>QObject</classname> che trasmette il segnale, ovvero che può emettere questo segnale; poi si specifica il segnale che si vuole connettere. Gli ultimi due parametri sono l'oggetto ricevitore che fornisce uno slot, seguito dalla funzione membro che in effetti è lo slot che sarà eseguito dopo l'emissione del segnale. </para>
<para>Si deve specificare come primo parametro un puntatore ad una istanza di <classname>TQObject</classname> che trasmette il segnale, ovvero che può emettere questo segnale; poi si specifica il segnale che si vuole connettere. Gli ultimi due parametri sono l'oggetto ricevitore che fornisce uno slot, seguito dalla funzione membro che in effetti è lo slot che sarà eseguito dopo l'emissione del segnale. </para>
<para>Utilizzando i segnali e gli slot gli oggetti dei proprio programma potranno interagire tra loro facilmente senza dipendere esplicitamente dal tipo dell'oggetto ricevente. Nei capitoli seguenti verrà spiegato come utilizzare in maniera produttiva questo meccanismo. Ulteriori informazioni sui segnali e gli slot possono essere trovati nella <ulink url="developer kde.org/documentation/library/libraryref.html">Guida di riferimento della libreria KDE</ulink> e nella <ulink url="doc.trolltech.com">documentazione Qt di riferimento</ulink>. </para>
<para>Utilizzando i segnali e gli slot gli oggetti dei proprio programma potranno interagire tra loro facilmente senza dipendere esplicitamente dal tipo dell'oggetto ricevente. Nei capitoli seguenti verrà spiegato come utilizzare in maniera produttiva questo meccanismo. Ulteriori informazioni sui segnali e gli slot possono essere trovati nella <ulink url="developer kde.org/documentation/library/libraryref.html">Guida di riferimento della libreria KDE</ulink> e nella <ulink url="doc.trolltech.com">documentazione Qt di riferimento</ulink>. </para>
<para>Per prima cosa è stata cambiata la classe <classname>QApplication</classname> con la classe <classname>TDEApplication</classname>. Inoltre è stato cambiato il metodo <methodname>setMainWidget()</methodname> usato precedentemente con il metodo <methodname>setTopWidget</methodname>, che viene usato da <classname>TDEApplication</classname> per impostare il widget principale. Ecco qua! La prima applicazione KDE è pronta - ora si deve solo indicare al compilatore il percorso di inclusione di KDE e al linker di collegare la libreria kdecode con l'opzione -ltdecore. </para>
<para>Per prima cosa è stata cambiata la classe <classname>QApplication</classname> con la classe <classname>TDEApplication</classname>. Inoltre è stato cambiato il metodo <methodname>setMainWidget()</methodname> usato precedentemente con il metodo <methodname>setTopWidget</methodname>, che viene usato da <classname>TDEApplication</classname> per impostare il widget principale. Ecco qua! La prima applicazione KDE è pronta - ora si deve solo indicare al compilatore il percorso di inclusione di KDE e al linker di collegare la libreria kdecode con l'opzione -ltdecore. </para>
<para>Ora che si conosce cosa fornisce la funzione <function>main()</function>, come rendere visibile l'applicazione e come gli oggetti interagiscono con l'utente, nel prossimo capitolo verrà creata una applicazione con &tdevelop;. Potremo quindi applicare e verificare quanto detto precedentemente. </para>
<para>Ora che si conosce cosa fornisce la funzione <function>main()</function>, come rendere visibile l'applicazione e come gli oggetti interagiscono con l'utente, nel prossimo capitolo verrà creata una applicazione con &tdevelop;. Potremo quindi applicare e verificare quanto detto precedentemente. </para>
<para>Prima di proseguire si dovrebbe consultare la documentazione di riferimento di Qt, in particolare le classi <classname> QApplication</classname>, <classname>QWidget</classname> e <classname>QObject</classname>, e la documentazione della libreria tdecore per la classe <classname>TDEApplication </classname>. Il <ulink url="developer.kde.org/documentation/library/libraryref.html">manuale di riferimento delle librerie KDE</ulink> include una descrizione completa sulle chiamate ai costruttori delle classi <classname>QApplication</classname> e <classname> TDEApplication</classname> e l'elaborazione degli argomenti a linea di comando. </para>
<para>Prima di proseguire si dovrebbe consultare la documentazione di riferimento di Qt, in particolare le classi <classname> QApplication</classname>, <classname>TQWidget</classname> e <classname>TQObject</classname>, e la documentazione della libreria tdecore per la classe <classname>TDEApplication </classname>. Il <ulink url="developer.kde.org/documentation/library/libraryref.html">manuale di riferimento delle librerie KDE</ulink> include una descrizione completa sulle chiamate ai costruttori delle classi <classname>QApplication</classname> e <classname> TDEApplication</classname> e l'elaborazione degli argomenti a linea di comando. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // allow the view to change the statusbar and caption
18 // allow the view to change the statusbar and caption
<para>Non c'è bisogno di dire che la stabilità è l'obiettivo principale della progettazione. Nessuno può evitare gli errori, ma si può almeno effettuare una progettazione saggia e orientata agli oggetti. Il linguaggio C++ rende la programmazione un piacere se si sfruttano le sue capacità come ereditarietà, incapsulamento e riuso del codice già esistente. </para>
<para>Non c'è bisogno di dire che la stabilità è l'obiettivo principale della progettazione. Nessuno può evitare gli errori, ma si può almeno effettuare una progettazione saggia e orientata agli oggetti. Il linguaggio C++ rende la programmazione un piacere se si sfruttano le sue capacità come ereditarietà, incapsulamento e riuso del codice già esistente. </para>
<para>Quando si crea un progetto KDE o Qt, si dovrà avere sempre una vista che deriva da QWidget per ereditarietà diretta o perché il widget di libreria che si vuole usare deriva da QWidget. Quindi la procedura guidata per l'applicazioni crea una vista che è istanza di una classe di nome NomeApplicazioneView che deriva da QWidget. </para>
<para>Quando si crea un progetto KDE o Qt, si dovrà avere sempre una vista che deriva da TQWidget per ereditarietà diretta o perché il widget di libreria che si vuole usare deriva da TQWidget. Quindi la procedura guidata per l'applicazioni crea una vista che è istanza di una classe di nome NomeApplicazioneView che deriva da TQWidget. </para>
<para>Questo capitolo descrive come usare i widget delle librerie per creare viste di applicazioni KDE o Qt che sono generate con &tdevelop;, in seguito si esamineranno le librerie e i tipi di viste disponibili. </para>
<para>Questo capitolo descrive come usare i widget delle librerie per creare viste di applicazioni KDE o Qt che sono generate con &tdevelop;, in seguito si esamineranno le librerie e i tipi di viste disponibili. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>Nella prima pagina della documentazione Qt in linea è presente un collegamento alle "schermate dei widget" dove si può osservare l'aspetto dei widget. Questi widget sono pronti per essere utilizzati direttamente o combinati assieme formando widget più complessi per creare viste di applicazioni o finestre di dialogo. In seguito saranno discussi alcuni di essi che sono utilizzabili per creare viste di applicazioni, ma ricordarsi che le librerie KDE contengono widget alternativi che servono agli stessi scopi; questi verranno esaminati nella prossima sezione. </para>
<para>Nella prima pagina della documentazione Qt in linea è presente un collegamento alle "schermate dei widget" dove si può osservare l'aspetto dei widget. Questi widget sono pronti per essere utilizzati direttamente o combinati assieme formando widget più complessi per creare viste di applicazioni o finestre di dialogo. In seguito saranno discussi alcuni di essi che sono utilizzabili per creare viste di applicazioni, ma ricordarsi che le librerie KDE contengono widget alternativi che servono agli stessi scopi; questi verranno esaminati nella prossima sezione. </para>
<para>Ecco una serie di suggerimenti per scegliere il componente Qt da usare per un particolare scopo <orderedlist>
<para>Ecco una serie di suggerimenti per scegliere il componente Qt da usare per un particolare scopo <orderedlist>
<listitem><para>Se l'area di vista non è abbastanza grande per visualizzare tutti i dati, l'utente deve poter scorrere il documento con le barre poste a lato e in basso. Qt fornisce la classe <classname>QScrollView</classname> che offre un'area figlio scorrevole. Si può derivare il proprio widget da questa classe o utilizzare una sua istanza. </para></listitem>
<listitem><para>Se l'area di vista non è abbastanza grande per visualizzare tutti i dati, l'utente deve poter scorrere il documento con le barre poste a lato e in basso. Qt fornisce la classe <classname>QScrollView</classname> che offre un'area figlio scorrevole. Si può derivare il proprio widget da questa classe o utilizzare una sua istanza. </para></listitem>
<listitem><para>per creare uno ScrollView, derivare il widget per la vista da <classname>QWidget</classname> e aggiungere una barra di scorrimento orizzontale ed una verticale <classname>QScrollBars</classname>. (Questo viene fatto dal widget TDEHTMLViews di KDE.) </para></listitem>
<listitem><para>per creare uno ScrollView, derivare il widget per la vista da <classname>TQWidget</classname> e aggiungere una barra di scorrimento orizzontale ed una verticale <classname>QScrollBars</classname>. (Questo viene fatto dal widget TDEHTMLViews di KDE.) </para></listitem>
<listitem><para>Per l'elaborazione del testo, usare <classname>QTextEdit</classname>. Questa classe include un widget per il testo completo che dispone delle funzionalità per tagliare, copiare e incollare testo ed è gestito da barre di scorrimento. </para></listitem>
<listitem><para>Per l'elaborazione del testo, usare <classname>QTextEdit</classname>. Questa classe include un widget per il testo completo che dispone delle funzionalità per tagliare, copiare e incollare testo ed è gestito da barre di scorrimento. </para></listitem>
<listitem><para>Usare la classe <classname>QTable</classname> per visualizzare i dati organizzati in una tabella. Siccome questa classe è gestita da barre di scorrimento, costituisce una buona soluzione per le applicazioni di calcolo con tabelle. </para></listitem>
<listitem><para>Usare la classe <classname>QTable</classname> per visualizzare i dati organizzati in una tabella. Siccome questa classe è gestita da barre di scorrimento, costituisce una buona soluzione per le applicazioni di calcolo con tabelle. </para></listitem>
<listitem><para>Per visualizzare due widget diversi o due istanze contemporaneamente,utilizzare la classe <classname>QSplitter</classname>. Questa permette di affiancare le viste verticalmente o orizzontalmente. Per osservare questo elemento grafico si può prendere come esempio KMail: la vista principale è separata da un divisore verticale, e la finestra a destra è a sua volta separata orizzontalmente. </para></listitem>
<listitem><para>Per visualizzare due widget diversi o due istanze contemporaneamente,utilizzare la classe <classname>QSplitter</classname>. Questa permette di affiancare le viste verticalmente o orizzontalmente. Per osservare questo elemento grafico si può prendere come esempio KMail: la vista principale è separata da un divisore verticale, e la finestra a destra è a sua volta separata orizzontalmente. </para></listitem>
<para>Il pulsante <guibutton>Che cos'è?</guibutton> visualizza una finestra quando l'utente vuole ricevere aiuto su un particolare widget o un elemento della barra degli strumenti. Esso è posizionato nella barra degli strumenti e viene attivato quando viene premuto. Il cursore del mouse diventa una freccia con un punto interrogativo, e quando viene fatto clic su un widget appare una finestra di aiuto. Come esercizio, si può provare usando il pulsante <guibutton>Che cos'è?</guibutton> in &tdevelop;. </para>
<para>Il pulsante <guibutton>Che cos'è?</guibutton> visualizza una finestra quando l'utente vuole ricevere aiuto su un particolare widget o un elemento della barra degli strumenti. Esso è posizionato nella barra degli strumenti e viene attivato quando viene premuto. Il cursore del mouse diventa una freccia con un punto interrogativo, e quando viene fatto clic su un widget appare una finestra di aiuto. Come esercizio, si può provare usando il pulsante <guibutton>Che cos'è?</guibutton> in &tdevelop;. </para>
<para>Per aggiungere l'aiuto Che cos'è? su un widget, usare il metodo statico <methodname>QWhatsThis::add(QWidget *widget, const QString &test)</methodname> </para>
<para>Per aggiungere l'aiuto Che cos'è? su un widget, usare il metodo statico <methodname>QWhatsThis::add(TQWidget *widget, const TQString &test)</methodname> </para>
<para>Il modello a basso livello di Qt per le immagini è basato sulle funzioni fornite da X11 e da altri sistemi grafici per i quali esiste il port di Qt. Tuttavia esso estende queste funzioni implementando funzionalità aggiuntive come le trasformazioni geometriche arbitrarie del testo e delle pixmap. </para>
<para>Il modello a basso livello di Qt per le immagini è basato sulle funzioni fornite da X11 e da altri sistemi grafici per i quali esiste il port di Qt. Tuttavia esso estende queste funzioni implementando funzionalità aggiuntive come le trasformazioni geometriche arbitrarie del testo e delle pixmap. </para>
<para>La classe grafica principale per il disegno 2D è <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Essa può disegnare su un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Sono stati implementati tre tipi di QPaintDevice: il primo è <ulink url="kdeapi:qt/QWidget">QWidget</ulink> che rappresenta un widget sullo schermo. Il secondo è <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> che rappresenta una stampante e produce un output PostScript. Il terzo è la classe <ulink url="kdeapi:qt/QPicture">QPicture</ulink> che registra i comandi di disegno e può salvarli sul disco per poterli riprodurre in seguito. Un possibile formato di memorizzazione per questi comandi di disegno è lo standard SVG del W3C. </para>
<para>La classe grafica principale per il disegno 2D è <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Essa può disegnare su un <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Sono stati implementati tre tipi di QPaintDevice: il primo è <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink> che rappresenta un widget sullo schermo. Il secondo è <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> che rappresenta una stampante e produce un output PostScript. Il terzo è la classe <ulink url="kdeapi:qt/QPicture">QPicture</ulink> che registra i comandi di disegno e può salvarli sul disco per poterli riprodurre in seguito. Un possibile formato di memorizzazione per questi comandi di disegno è lo standard SVG del W3C. </para>
<para>In questo modo è possibile stampare riutilizzando il codice di disegno usato per visualizzare un widget. Naturalmente il codice viene usato in un contesto leggermente diverso: il disegno di un widget viene fatto quasi esclusivamente nel metodo paintEvent() di una classe widget. </para>
<para>In questo modo è possibile stampare riutilizzando il codice di disegno usato per visualizzare un widget. Naturalmente il codice viene usato in un contesto leggermente diverso: il disegno di un widget viene fatto quasi esclusivamente nel metodo paintEvent() di una classe widget. </para>
<para>QBrush::QBrush(BrushStyle) - Crea un pennello nero con uno dei motivi predefiniti mostrati sotto.</para>
<para>QBrush::QBrush(BrushStyle) - Crea un pennello nero con uno dei motivi predefiniti mostrati sotto.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, BrushStyle) - Crea un pennello colorato con uno dei motivi di default mostrati sotto.</para>
<para>QBrush::QBrush(const TQColor &, BrushStyle) - Crea un pennello colorato con uno dei motivi di default mostrati sotto.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, const QPixmap) - Crea un pennello colorato con un motivo personalizzato fornito come secondo parametro.</para>
<para>QBrush::QBrush(const TQColor &, const QPixmap) - Crea un pennello colorato con un motivo personalizzato fornito come secondo parametro.</para>
<para>I colori vengono usati quando si disegnano curve e quando si riempiono forme. In Qt i colori sono rappresentati dalla classe <ulink url="kdeapi:qt/QColor">QColor</ulink>. Qt non supporta funzioni grafiche avanzate come i profili di colore ICC e la correzione del colore. I colori sono normalmente costruiti specificando i componenti rosso, verde e blu, come il modello RGB usato per i pixel di un monitor. </para>
<para>I colori vengono usati quando si disegnano curve e quando si riempiono forme. In Qt i colori sono rappresentati dalla classe <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. Qt non supporta funzioni grafiche avanzate come i profili di colore ICC e la correzione del colore. I colori sono normalmente costruiti specificando i componenti rosso, verde e blu, come il modello RGB usato per i pixel di un monitor. </para>
<para>È possibile anche usare la tonalità, la saturazione e la luminosità. Questa rappresentazione HSV è quella usata nella finestra di dialogo Gtk per il colore, per es. in GIMP. Qui, la tonalità corrisponde ad un angolo sulla ruota del colore, mentre la saturazione corrisponde alla distanza dal centro del cerchio. La luminosità può essere scelta su un'indicatore separato. </para>
<para>È possibile anche usare la tonalità, la saturazione e la luminosità. Questa rappresentazione HSV è quella usata nella finestra di dialogo Gtk per il colore, per es. in GIMP. Qui, la tonalità corrisponde ad un angolo sulla ruota del colore, mentre la saturazione corrisponde alla distanza dal centro del cerchio. La luminosità può essere scelta su un'indicatore separato. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corrisponde direttamente alle pixmap di X11. Le pixmap sono oggetti server-side e possono - su schede grafiche recenti - anche essere memorizzate direttamente nella memoria della scheda. Questo rende <emphasis>molto</emphasis> efficiente trasferire pixmap sullo schermo. Queste fungono anche come un'equivalente dei widget - la classe QPixmap è una sottoclasse di QPaintDevice, quindi la si può disegnare con un QPainter. Le operazioni di disegno elementari sono normalmente accelerate dalle schede grafiche moderne, quindi è un'abitudine comune usare le pixmap per il double buffering. In questo modo, invece di disegnare direttamente su un widget, si disegna su un oggetto pixmap temporaneo e si usa la funzione <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> per trasferire la pixmap nel widget. Nelle operazioni di ridisegno più complesse questo può aiutare per evitare gli sfarfalii. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corrisponde direttamente alle pixmap di X11. Le pixmap sono oggetti server-side e possono - su schede grafiche recenti - anche essere memorizzate direttamente nella memoria della scheda. Questo rende <emphasis>molto</emphasis> efficiente trasferire pixmap sullo schermo. Queste fungono anche come un'equivalente dei widget - la classe QPixmap è una sottoclasse di QPaintDevice, quindi la si può disegnare con un QPainter. Le operazioni di disegno elementari sono normalmente accelerate dalle schede grafiche moderne, quindi è un'abitudine comune usare le pixmap per il double buffering. In questo modo, invece di disegnare direttamente su un widget, si disegna su un oggetto pixmap temporaneo e si usa la funzione <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> per trasferire la pixmap nel widget. Nelle operazioni di ridisegno più complesse questo può aiutare per evitare gli sfarfalii. </para>
<para>Al contrario, gli oggetti <ulink url="kdeapi:qt/QImage">QImage</ulink> sono client-side. La loro caratteristica consiste nel fornire un accesso diretto ai pixel, che li rende utili per la manipolazione delle immagini e per altre cose come il caricamento e il salvataggio sul disco (il metodo load() di QPixmap riceve un oggetto QImage come fase intermedia). D'altra parte, dipingere un'immagine su un widget è un'operazione costosa, poiché implica un trasferimento nel server X, che richiede parecchio tempo specialmente con immagini grandi e su server remoti. La conversione da QImage a QPixmap può richiedere anche la retinatura, a seconda della profondità del colore. </para>
<para>Al contrario, gli oggetti <ulink url="kdeapi:qt/TQImage">TQImage</ulink> sono client-side. La loro caratteristica consiste nel fornire un accesso diretto ai pixel, che li rende utili per la manipolazione delle immagini e per altre cose come il caricamento e il salvataggio sul disco (il metodo load() di QPixmap riceve un oggetto TQImage come fase intermedia). D'altra parte, dipingere un'immagine su un widget è un'operazione costosa, poiché implica un trasferimento nel server X, che richiede parecchio tempo specialmente con immagini grandi e su server remoti. La conversione da TQImage a QPixmap può richiedere anche la retinatura, a seconda della profondità del colore. </para>
<para>Il testo può essere disegnato con una delle versioni sovraccaricate del metodo QPainter::drawText(). Queste disegnano una QString in un certo punto o in un certo rettangolo, usando il font impostato con il metodo QPainter::setFont(). C'è anche un parametro che riceve una combinazione ORed di alcuni flag dell'enumerazione <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> e <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>Il testo può essere disegnato con una delle versioni sovraccaricate del metodo QPainter::drawText(). Queste disegnano una TQString in un certo punto o in un certo rettangolo, usando il font impostato con il metodo QPainter::setFont(). C'è anche un parametro che riceve una combinazione ORed di alcuni flag dell'enumerazione <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> e <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>Dalla versione 3.0, Qt si occupa della disposizione del testo anche per i linguaggi scritti da destra verso sinistra. </para>
<para>Dalla versione 3.0, Qt si occupa della disposizione del testo anche per i linguaggi scritti da destra verso sinistra. </para>
<para>In aggiunta alle voci normali, questo esempio mostra come dichiarare un servizio che ha alcune proprietà. Ogni definizione di proprietà corrisponde al gruppo <literal>[PropertyDef::name]</literal> nel file di configurazione. La voce <literal>Type</literal> di questo gruppo dichiara il tipo della proprietà. I tipi possibili sono tutti quelli che possono essere memorizzati in un <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>In aggiunta alle voci normali, questo esempio mostra come dichiarare un servizio che ha alcune proprietà. Ogni definizione di proprietà corrisponde al gruppo <literal>[PropertyDef::name]</literal> nel file di configurazione. La voce <literal>Type</literal> di questo gruppo dichiara il tipo della proprietà. I tipi possibili sono tutti quelli che possono essere memorizzati in un <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Con un oggetto <classname>KService</classname> si può semplicemente caricare la libreria e ottenere un puntatore al suo oggetto factory: </para>
<para>Con un oggetto <classname>KService</classname> si può semplicemente caricare la libreria e ottenere un puntatore al suo oggetto factory: </para>
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>In questo esempio il servizio è stato avviato "con il nome", cioè il primo argomento della funzione <function>TDEApplication::startServiceByName()</function> è il nome che appare nella linea <literal>Name</literal> del file desktop. In alternativa si può usare la funzione <function>TDEApplication::startServiceByDesktopName()</function>, che accetta come argomento il nome del suo file desktop, in questo caso <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>In questo esempio il servizio è stato avviato "con il nome", cioè il primo argomento della funzione <function>TDEApplication::startServiceByName()</function> è il nome che appare nella linea <literal>Name</literal> del file desktop. In alternativa si può usare la funzione <function>TDEApplication::startServiceByDesktopName()</function>, che accetta come argomento il nome del suo file desktop, in questo caso <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Tutte queste chiamate ricevono come secondo argomento una lista di URL, che viene passata al servizio a linea di comando. Il terzo argomento è un puntatore ad una <classname>QString</classname>. Se l'avvio del servizio non riesce questo argomento punta ad un messaggio di errore. </para>
<para>Tutte queste chiamate ricevono come secondo argomento una lista di URL, che viene passata al servizio a linea di comando. Il terzo argomento è un puntatore ad una <classname>TQString</classname>. Se l'avvio del servizio non riesce questo argomento punta ad un messaggio di errore. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Ovviamente anche KMimeMagic è in grado di determinare solo il tipo del file dai contenuti di un file locale. Per i file remoti esiste un'ulteriore possibilità: </para>
<para>Ovviamente anche KMimeMagic è in grado di determinare solo il tipo del file dai contenuti di un file locale. Per i file remoti esiste un'ulteriore possibilità: </para>
<para>Si presume che tu ti trovi in un file &kommander; ed hai accesso al comando speciale @pid che contiene l'ID del processo. Nella pratica è più semplice sostituire <quote>kmdr-executor-@pid</quote> con @dcopid. Per modificare la finestra di &kommander;, puoi, comunque, utilizzare questa sintassi (ovviamente senza i comandi speciali) dalla linea di comando o da qualsiasi altro script esterno. </para>
<para>Si presume che tu ti trovi in un file &kommander; ed hai accesso al comando speciale @pid che contiene l'ID del processo. Nella pratica è più semplice sostituire <quote>kmdr-executor-@pid</quote> con @dcopid. Per modificare la finestra di &kommander;, puoi, comunque, utilizzare questa sintassi (ovviamente senza i comandi speciali) dalla linea di comando o da qualsiasi altro script esterno. </para>
<para>Dato che &kommander; non possiede un analizzatore completo nel sua fase Alpha, usare il comando &DCOP; interno, molto più rapido, dalla finestra di un'altra applicazione (la console &DCOP; è molto lenta) è più complicato perché devi fornire molte informazioni, incluso un prototipo della chiamata. La chiamata di prima diventerebbe: </para>
<para>Dato che &kommander; non possiede un analizzatore completo nel sua fase Alpha, usare il comando &DCOP; interno, molto più rapido, dalla finestra di un'altra applicazione (la console &DCOP; è molto lenta) è più complicato perché devi fornire molte informazioni, incluso un prototipo della chiamata. La chiamata di prima diventerebbe: </para>
<para>Al momento in cui questo manuale è stato scritto dovresti sapere che annidare chiamate &DCOP; all'interno di strutture di linguaggi di script (come <application>bash</application>) impone l'utilizzo dei metodi di chiamata da console. <emphasis>Se utilizzi il &DCOP; interno tutti i comandi speciali di &kommander; saranno eseguiti prima dello script.</emphasis> </para>
<para>Al momento in cui questo manuale è stato scritto dovresti sapere che annidare chiamate &DCOP; all'interno di strutture di linguaggi di script (come <application>bash</application>) impone l'utilizzo dei metodi di chiamata da console. <emphasis>Se utilizzi il &DCOP; interno tutti i comandi speciali di &kommander; saranno eseguiti prima dello script.</emphasis> </para>
<para>Esiste una nuova modalità semplificata di utilizzare &DCOP; all'interno di &kommander; utilizzando una sintassi ad oggetti. Supponiamo che tu voglia cambiare il testo in un widget chiamato @LineEdit1. Si scriverebbe così. </para>
<para>Esiste una nuova modalità semplificata di utilizzare &DCOP; all'interno di &kommander; utilizzando una sintassi ad oggetti. Supponiamo che tu voglia cambiare il testo in un widget chiamato @LineEdit1. Si scriverebbe così. </para>
<para>Restituisce il valore della variabile globale specificata. Quando uno script viene lanciato all'interno di una finestra di &kommander; qualsiasi variabile (non globale) impostata in quello script cesserà di esistere una volta terminato lo script e perciò non sarà più disponibile ai processi degli altri script o in una nuova istanza del processo chiamante. Nel <quote>contesto</quote> globale la variabile esisterà per ogni processo od ogni finestra fino al momento in cui quella viene chiusa. Puoi modificare queste variabili in ogni momento con una nuova chiamata a <function>@setGlobal</function>. </para>
<para>Restituisce il valore della variabile globale specificata. Quando uno script viene lanciato all'interno di una finestra di &kommander; qualsiasi variabile (non globale) impostata in quello script cesserà di esistere una volta terminato lo script e perciò non sarà più disponibile ai processi degli altri script o in una nuova istanza del processo chiamante. Nel <quote>contesto</quote> globale la variabile esisterà per ogni processo od ogni finestra fino al momento in cui quella viene chiusa. Puoi modificare queste variabili in ogni momento con una nuova chiamata a <function>@setGlobal</function>. </para>
<para>Crea una variabile che è globale per la finestra del processo e le assegna un valore. Questo valore può essere recuperato con global(QString nomeVariabile) o reimpostato. </para>
<para>Crea una variabile che è globale per la finestra del processo e le assegna un valore. Questo valore può essere recuperato con global(TQString nomeVariabile) o reimpostato. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString testo)</term>
<term>changeWidgetText(TQString testo)</term>
<listitem>
<listitem>
<para>Questo comando dovrebbe venir rinominato in setWidgetText ed il suo nome verrà probabilmente deprecato. Esso rimuove il testo visualizzato nel widget sostituendolo con il testo fornito. </para>
<para>Questo comando dovrebbe venir rinominato in setWidgetText ed il suo nome verrà probabilmente deprecato. Esso rimuove il testo visualizzato nel widget sostituendolo con il testo fornito. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString testo)</term>
<term>setAssociatedText(TQString testo)</term>
<listitem>
<listitem>
<para>Imposta la stringa predefinita di Testo di &kommander;. Questa è tipicamente impostata a <quote>@widgetText</quote> per visualizzare ciò che viene inserito nel widget. È raro che tu ne abbia bisogno, in ogni caso c'è. Viene applicato a tutti i widget che contengono informazioni. </para>
<para>Imposta la stringa predefinita di Testo di &kommander;. Questa è tipicamente impostata a <quote>@widgetText</quote> per visualizzare ciò che viene inserito nel widget. È raro che tu ne abbia bisogno, in ogni caso c'è. Viene applicato a tutti i widget che contengono informazioni. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>&DCOP; per i Widget ListBox e ComboBox</title>
<title>&DCOP; per i Widget ListBox e ComboBox</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString elemento, int indice)</term>
<term>addListItem(TQString elemento, int indice)</term>
<listitem>
<listitem>
<para>Aggiunge un elemento ad un widget ListBox all'indice specificato. L'indice della lista comincia da zero. Per aggiungere alla fine della lista utilizzare -1. </para>
<para>Aggiunge un elemento ad un widget ListBox all'indice specificato. L'indice della lista comincia da zero. Per aggiungere alla fine della lista utilizzare -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString elemento)</term>
<term>addUniqueItem(TQString elemento)</term>
<listitem>
<listitem>
<para>addUniqueItem aggiungerà un elemento alla fine della lista solo se non è già presente. </para>
<para>addUniqueItem aggiungerà un elemento alla fine della lista solo se non è già presente. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>&DCOP; per i Widget CheckBox e RadioButton</title>
<title>&DCOP; per i Widget CheckBox e RadioButton</title>
<para>Voordat uw programma begint met het rekenintensieve werk, of voordat het begint met het laden van plugins, &etc;, roept u &ksplash; als volgt aan:</para>
<para>Voordat uw programma begint met het rekenintensieve werk, of voordat het begint met het laden van plugins, &etc;, roept u &ksplash; als volgt aan:</para>
<listitem><para>Pluginklassen moeten een <literal>statische</literal> functie met de naam <function>names</function> aanleveren, die een lijst met namen teruggeeft die de plugin kunnen aanroepen.</para></listitem>
<listitem><para>Pluginklassen moeten een <literal>statische</literal> functie met de naam <function>names</function> aanleveren, die een lijst met namen teruggeeft die de plugin kunnen aanroepen.</para></listitem>
<listitem><para>Als de plugin kan worden ingesteld in de configuratiemodule, dan moet het een op <literal>ThemeEngineConfig</literal>-gebaseerde klasse aanleveren voor de configuratie.</para></listitem>
<listitem><para>Als de plugin kan worden ingesteld in de configuratiemodule, dan moet het een op <literal>ThemeEngineConfig</literal>-gebaseerde klasse aanleveren voor de configuratie.</para></listitem>
<listitem><para>Pluginklassen moeten tenminste één van de virtuele functies <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> en <function>slotUpdateSteps</function> onderdrukken (<foreignphrase lang="en">override</foreignphrase>) om het bruikbaar te maken.</para></listitem>
<listitem><para>Pluginklassen moeten tenminste één van de virtuele functies <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> en <function>slotUpdateSteps</function> onderdrukken (<foreignphrase lang="en">override</foreignphrase>) om het bruikbaar te maken.</para></listitem>
<listitem><para>De constructor moet de vorm <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> hebben, zodat het kan worden gebruikt met <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>De constructor moet de vorm <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> hebben, zodat het kan worden gebruikt met <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>De laatste vereiste lijkt moeilijk, maar, zoals we later zullen zien, door één regel tekst toe te voegen aan uw broncoderegels kunt u het meestal negeren.</para>
<para>De laatste vereiste lijkt moeilijk, maar, zoals we later zullen zien, door één regel tekst toe te voegen aan uw broncoderegels kunt u het meestal negeren.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Laten we de bovenstaande inhoud analyseren. De klasse <classname>Theme2k</classname> voldoet aan de naamconventies en is overgeërfd van <classname>ThemeEngine</classname>. De klasse levert een <methodname>Theme2k::names()</methodname>, en heeft een constructor die de vereiste paramaters pakt: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> en ook een eenvoudige methode <methodname>Theme2k::slotSetText()</methodname>levert. Maak u op dit moment niet druk over de klasse <classname>RotWidget</classname>. Het is een kleine widget die wat eye candy voor de gebruiker aanlevert. Onze plugin is erg eenvoudig en toont geen pictogrammen of voortgangsbalk. Als u pictogrammen wilt gebruiken, onderdruk (<foreignphrase lang="en">override</foreignphrase>) dan de functie <function>slotSetPixmap</function>. Vergelijkbare functies bestaan voor het instellen van de voorgangsbalkbereik (<function>slotUpdateSteps</function> en het ophogen van de huidige stap (<function>slotUpdateProgress</function>). </para>
<para>Laten we de bovenstaande inhoud analyseren. De klasse <classname>Theme2k</classname> voldoet aan de naamconventies en is overgeërfd van <classname>ThemeEngine</classname>. De klasse levert een <methodname>Theme2k::names()</methodname>, en heeft een constructor die de vereiste paramaters pakt: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> en ook een eenvoudige methode <methodname>Theme2k::slotSetText()</methodname>levert. Maak u op dit moment niet druk over de klasse <classname>RotWidget</classname>. Het is een kleine widget die wat eye candy voor de gebruiker aanlevert. Onze plugin is erg eenvoudig en toont geen pictogrammen of voortgangsbalk. Als u pictogrammen wilt gebruiken, onderdruk (<foreignphrase lang="en">override</foreignphrase>) dan de functie <function>slotSetPixmap</function>. Vergelijkbare functies bestaan voor het instellen van de voorgangsbalkbereik (<function>slotUpdateSteps</function> en het ophogen van de huidige stap (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementatie van de plugin</title>
<title>Implementatie van de plugin</title>
@ -686,7 +686,7 @@ private:
<para>De macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> is gedeclareerd in <filename>kgenericfactory.h</filename>. Nu naar de constructor! Omdat het een eenvoudige plugin is, is de constructor vrij rechtlijnig.</para>
<para>De macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> is gedeclareerd in <filename>kgenericfactory.h</filename>. Nu naar de constructor! Omdat het een eenvoudige plugin is, is de constructor vrij rechtlijnig.</para>
<para>De <abbrev>DCOP</abbrev>-interface van &kstars; heeft de volgende functies: <itemizedlist>
<para>De <abbrev>DCOP</abbrev>-interface van &kstars; heeft de volgende functies: <itemizedlist>
<listitem><para><function> lookTowards( const QString richting )</function>: Richten van de kijkrichting in het schermbeeld in de richting die door het argument "richting" wordt gegeven. Dit kan de naam zijn van een hemelobject, of een van de volgende woorden of afkortingen: zenith (of z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw).
<listitem><para><function> lookTowards( const TQString richting )</function>: Richten van de kijkrichting in het schermbeeld in de richting die door het argument "richting" wordt gegeven. Dit kan de naam zijn van een hemelobject, of een van de volgende woorden of afkortingen: zenith (of z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw).
("zenith"->zenit, "north"->noord, "northeast"->noordoost, "east"->oost, "southeast"->zuidoost, "south"->zuid, "southwest"->zuidwest, "west"->west, "northwest"->noordwest - dit dient alleen als toelichting, het is duidelijk dat van deze waarden alleen de Engelse namen zullen worden begrepen ... ). </para></listitem>
("zenith"->zenit, "north"->noord, "northeast"->noordoost, "east"->oost, "southeast"->zuidoost, "south"->zuid, "southwest"->zuidwest, "west"->west, "northwest"->noordwest - dit dient alleen als toelichting, het is duidelijk dat van deze waarden alleen de Engelse namen zullen worden begrepen ... ). </para></listitem>
@ -30,15 +30,15 @@
<listitem><para><function> waitFor( double t )</function>: "t" seconden pauzeren, alvorens verder te gaan met de volgende opdrachten van de script. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: "t" seconden pauzeren, alvorens verder te gaan met de volgende opdrachten van de script. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: De verdere uitvoering van de script stoppen, totdat de opgegeven toets "k" wordt ingedrukt. Momenteel kunt u nog geen gecombineerde toetsaanslagen opgeven (zoals <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); u kunt alleen enkelvoudige toetsaanslagen gebruiken. Om de spatiebalk op te geven typt u <quote>space</quote>.
<listitem><para><function> waitForKey( const TQString k )</function>: De verdere uitvoering van de script stoppen, totdat de opgegeven toets "k" wordt ingedrukt. Momenteel kunt u nog geen gecombineerde toetsaanslagen opgeven (zoals <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); u kunt alleen enkelvoudige toetsaanslagen gebruiken. Om de spatiebalk op te geven typt u <quote>space</quote>.
("space" betekent spatie). </para></listitem>
("space" betekent spatie). </para></listitem>
<listitem><para><function> setTracking( bool volgen )</function>: Volgen aan of uitschakelen. ("volgen" is een booleaanse variabele, wat betekent dat die alleen de standaardwaarden "true" of "false" kan hebben (wel volgen, of niet volgen)). </para></listitem>
<listitem><para><function> setTracking( bool volgen )</function>: Volgen aan of uitschakelen. ("volgen" is een booleaanse variabele, wat betekent dat die alleen de standaardwaarden "true" of "false" kan hebben (wel volgen, of niet volgen)). </para></listitem>
<listitem><para><function> changeViewOption( const QString optie, const QString waarde )</function>: Instellen van een weergaveoptie. Er zijn er vele tientallen beschikbaar; in principe kunnen alle opties die in het venster <guilabel>Weergaveopties</guilabel> kunnen worden gewijzigd ook hier worden veranderd. Het eerste argument ("optie") is de naam van de optie, (de namen komen uit het configuratiebestand <filename>kstarsrc</filename>), en het tweede argument ("waarde") is de gewenste waarde. Het argumentleesprogramma is robuust, dus als u per ongeluk verkeerde gegevens invult zullen die op een nette manier worden geweigerd. </para></listitem>
<listitem><para><function> changeViewOption( const TQString optie, const TQString waarde )</function>: Instellen van een weergaveoptie. Er zijn er vele tientallen beschikbaar; in principe kunnen alle opties die in het venster <guilabel>Weergaveopties</guilabel> kunnen worden gewijzigd ook hier worden veranderd. Het eerste argument ("optie") is de naam van de optie, (de namen komen uit het configuratiebestand <filename>kstarsrc</filename>), en het tweede argument ("waarde") is de gewenste waarde. Het argumentleesprogramma is robuust, dus als u per ongeluk verkeerde gegevens invult zullen die op een nette manier worden geweigerd. </para></listitem>
<listitem><para><function> setGeoLocation( const QString stad, const QString provincie, const QString land )</function>: De waarnemingslocatie naar de gewenste stad veranderen. Als er geen stad wordt gevonden die met de opgegeven waarden overeenkomt, gebeurt er niets. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString stad, const TQString provincie, const TQString land )</function>: De waarnemingslocatie naar de gewenste stad veranderen. Als er geen stad wordt gevonden die met de opgegeven waarden overeenkomt, gebeurt er niets. </para></listitem>
<listitem><para><function> stop()</function> [clock]: De simulatieklok stoppen. </para></listitem>
<listitem><para><function> stop()</function> [clock]: De simulatieklok stoppen. </para></listitem>
<listitem><para>Algemene apparaatfuncties: Functies voor het aanzetten/afsluiten van apparaten etc.</para>
<listitem><para>Algemene apparaatfuncties: Functies voor het aanzetten/afsluiten van apparaten etc.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString apparaatNaam, bool gebruikLokaal)</function> : Het aanzetten van een dienst van INDI als lokaal of als server.</para></listitem>
<listitem><para><function>startINDI (TQString apparaatNaam, bool gebruikLokaal)</function> : Het aanzetten van een dienst van INDI als lokaal of als server.</para></listitem>
<listitem><para><function>shutdownINDI (QString apparaatNaam)</function> : Afsluiten van de dienst INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString apparaatNaam)</function> : Afsluiten van de dienst INDI.</para></listitem>
<listitem><para><function>switchINDI(QString apparaatNaam, bool aanzetten)</function> : Aan- of afkoppelen van een INDI-apparaat.</para></listitem>
<listitem><para><function>switchINDI(TQString apparaatNaam, bool aanzetten)</function> : Aan- of afkoppelen van een INDI-apparaat.</para></listitem>
<listitem><para><function>setINDIPort(QString apparaatNaam, QString poort)</function> : De verbindingspoort van het apparaat instellen.</para></listitem>
<listitem><para><function>setINDIPort(TQString apparaatNaam, TQString poort)</function> : De verbindingspoort van het apparaat instellen.</para></listitem>
<listitem><para><function>setINDIAction(QString apparaatNaam, QString actie)</function> : Een INDI-actie activeren. De actie kan elk <emphasis>element</emphasis> zijn van een <emphasis>schakeleigenschap</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString apparaatNaam, TQString actie)</function> : Een INDI-actie activeren. De actie kan elk <emphasis>element</emphasis> zijn van een <emphasis>schakeleigenschap</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString apparaatNaam, QString actie)</function> : De scriptuitvoering onderbreken totdat een opgegeven actie<emphasis>eigenschap</emphasis> de OK-status retourneert.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString apparaatNaam, TQString actie)</function> : De scriptuitvoering onderbreken totdat een opgegeven actie<emphasis>eigenschap</emphasis> de OK-status retourneert.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Telescoopfuncties: Functies voor de besturing van de telescoopbeweging en -status.</para>
<listitem><para>Telescoopfuncties: Functies voor de besturing van de telescoopbeweging en -status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString apparaatNaam, QString actie)</function> : Voor het instellen van de telescoopmodus of -actie. Beschikbare opties zijn SLEW, TRACK, SYNC, PARK, and ABORT (verplaatsen, volgen, synchroniseren, parkeren en afbreken).</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString apparaatNaam, TQString actie)</function> : Voor het instellen van de telescoopmodus of -actie. Beschikbare opties zijn SLEW, TRACK, SYNC, PARK, and ABORT (verplaatsen, volgen, synchroniseren, parkeren en afbreken).</para></listitem>
<listitem><para><function>setINDITargetCoord(QString apparaatNaam, double RK, double DEC)</function> : Voor het instellen van de "JNow"-doelcoördinaten van de telescoop: <emphasis>RK</emphasis> en <emphasis>DEC</emphasis>.
<listitem><para><function>setINDITargetCoord(TQString apparaatNaam, double RK, double DEC)</function> : Voor het instellen van de "JNow"-doelcoördinaten van de telescoop: <emphasis>RK</emphasis> en <emphasis>DEC</emphasis>.
Noot vertaler: "Jnow" betekent: epoche van dit moment. Een telescoop moet noodzakelijkerwijs werken met de coördinaten die voor precessie zijn gecorrigeerd naar die van het moment waarop de telescoop wordt gebruikt.</para></listitem>
Noot vertaler: "Jnow" betekent: epoche van dit moment. Een telescoop moet noodzakelijkerwijs werken met de coördinaten die voor precessie zijn gecorrigeerd naar die van het moment waarop de telescoop wordt gebruikt.</para></listitem>
<listitem><para><function>setINDITargetName(QString apparaatNaam, QString objectNaam)</function> : Voor het instellen van de "JNow"-doelcoördinaten van de telescoop naar die van <emphasis>objectNaam</emphasis>. KStars zoekt objectNaam op in zijn gegevensbank en als die wordt gevonden worden de RK en Dec daar opgehaald.
<listitem><para><function>setINDITargetName(TQString apparaatNaam, TQString objectNaam)</function> : Voor het instellen van de "JNow"-doelcoördinaten van de telescoop naar die van <emphasis>objectNaam</emphasis>. KStars zoekt objectNaam op in zijn gegevensbank en als die wordt gevonden worden de RK en Dec daar opgehaald.
Noot vertaler: "Jnow" betekent: epoche van dit moment. Een telescoop moet noodzakelijkerwijs werken met de coördinaten die voor precessie zijn gecorrigeerd naar die van het moment waarop de telescoop wordt gebruikt.</para></listitem>
Noot vertaler: "Jnow" betekent: epoche van dit moment. Een telescoop moet noodzakelijkerwijs werken met de coördinaten die voor precessie zijn gecorrigeerd naar die van het moment waarop de telescoop wordt gebruikt.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString apparaatNaam, double lengte, double breedte)</function> : Het instellen van de geografische locatie van de telescoop volgens de opgegeven coördinaten. De lengte wordt gerekend vanaf de Meridiaan van Greenwich , VK, in oostelijke richting. Maar, hoewel het gewoon is om voor westelijke lengtes negatieve waarden te gebruiken, vereist INDI waarden voor de lengtes tussen 0 en 360 graden. Dus bij een negatieve lengte moet er voor INDI 360 graden worden bijgeteld. De lengte van Calgary, Canada, bijvoorbeeld, is volgens KStars: -114 04 58 (negatief, dus west), en de breedte: 51 02 58. Dus voor INDI moeten wij bij de negatieve lengte 360 graden optellen: -114,083 + 360 = 245,917 graden (-114,083 is de in decimale graden omgezette lengte -114 04 58, waarbij 04 minuten 58 seconden = 4/60 + 58/3600 = 0,082777... graden).</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString apparaatNaam, double lengte, double breedte)</function> : Het instellen van de geografische locatie van de telescoop volgens de opgegeven coördinaten. De lengte wordt gerekend vanaf de Meridiaan van Greenwich , VK, in oostelijke richting. Maar, hoewel het gewoon is om voor westelijke lengtes negatieve waarden te gebruiken, vereist INDI waarden voor de lengtes tussen 0 en 360 graden. Dus bij een negatieve lengte moet er voor INDI 360 graden worden bijgeteld. De lengte van Calgary, Canada, bijvoorbeeld, is volgens KStars: -114 04 58 (negatief, dus west), en de breedte: 51 02 58. Dus voor INDI moeten wij bij de negatieve lengte 360 graden optellen: -114,083 + 360 = 245,917 graden (-114,083 is de in decimale graden omgezette lengte -114 04 58, waarbij 04 minuten 58 seconden = 4/60 + 58/3600 = 0,082777... graden).</para></listitem>
<listitem><para><function>setINDIUTC(QString apparaatNaam, QString UTCDatumTijd)</function> : Voor het instellen van de UTC-datum en -tijd in ISO 8601 formaat. Dit formaat is YYYY-MM-DDTHH:MM:SS (bijv. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString apparaatNaam, TQString UTCDatumTijd)</function> : Voor het instellen van de UTC-datum en -tijd in ISO 8601 formaat. Dit formaat is YYYY-MM-DDTHH:MM:SS (bijv. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Camera/CCD-Functies voor de besturing van de eigenschappen en status van de camera/CCD.</para>
<listitem><para>Camera/CCD-Functies voor de besturing van de eigenschappen en status van de camera/CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString apparaatNaam, int temp)</function> : Voor het instellen van de beoogde temperatuur van de CCD-chip in graden Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString apparaatNaam, int temp)</function> : Voor het instellen van de beoogde temperatuur van de CCD-chip in graden Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString apparaatNaam, QString type)</function> : Voor het instellen van het belichtingstype van de CCD. Beschikbare opties zijn FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, and FRAME_FLAT (deze termen niet vertaald, daar de betekenis ervan bekend moet zijn om er zinvol mee te werken)
<listitem><para><function>setINDIFrameType(TQString apparaatNaam, TQString type)</function> : Voor het instellen van het belichtingstype van de CCD. Beschikbare opties zijn FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, and FRAME_FLAT (deze termen niet vertaald, daar de betekenis ervan bekend moet zijn om er zinvol mee te werken)
Dark frame: Belichting met gesloten sluiter.
Dark frame: Belichting met gesloten sluiter.
Flat frame: Belichting op een egaal verlicht oppervlak.
Flat frame: Belichting op een egaal verlicht oppervlak.
@ -72,19 +72,19 @@ Light frame: het eigenlijke beeld.
Dark, Flat en Bias frames dienen om het beeld te kunnen verbeteren.
Dark, Flat en Bias frames dienen om het beeld te kunnen verbeteren.
Ik raad aan om met bijvoorbeeld Google informatie hierover te vinden, maar kon zelf nauwelijks Nederlandse pagina's vinden (vert.)</para></listitem>
Ik raad aan om met bijvoorbeeld Google informatie hierover te vinden, maar kon zelf nauwelijks Nederlandse pagina's vinden (vert.)</para></listitem>
<listitem><para><function>startINDIExposure(QString apparaatNaam, int tijdsduur)</function> : Voor het instellen van de belichting van de CCD/Camera gedurende een <emphasis>tijdsduur</emphasis> in seconden.</para></listitem>
<listitem><para><function>startINDIExposure(TQString apparaatNaam, int tijdsduur)</function> : Voor het instellen van de belichting van de CCD/Camera gedurende een <emphasis>tijdsduur</emphasis> in seconden.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Focusserfuncties: Functies voor de besturing van de beweging en de status van de focusser (scherpstelinrichting).</para>
<listitem><para>Focusserfuncties: Functies voor de besturing van de beweging en de status van de focusser (scherpstelinrichting).</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString apparaatNaam, QString actie)</function> : Voor het instellen van de snelheid van de focusser. Beschikbare opties zijn FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, and FOCUS_FAST (focus_halt, _langzaam, _middel en _snel).</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString apparaatNaam, TQString actie)</function> : Voor het instellen van de snelheid van de focusser. Beschikbare opties zijn FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, and FOCUS_FAST (focus_halt, _langzaam, _middel en _snel).</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString apparaatNaam, int tijdsduur)</function> : Voor het instellen van de duur in seconden van enige volgende startINDIFocus-bewerking.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString apparaatNaam, int tijdsduur)</function> : Voor het instellen van de duur in seconden van enige volgende startINDIFocus-bewerking.</para></listitem>
<listitem><para><function>startINDIFocus(QString apparaatNaam, int focusRichting)</function> : Beweegt de focuser of naar binnen (focusRichting = 0) of naar buiten (focusRichting = 1). De snelheid en de tijdsduur van deze bewerking worden ingesteld met de functies <function>setINDIFocusSpeed()</function> en <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString apparaatNaam, int focusRichting)</function> : Beweegt de focuser of naar binnen (focusRichting = 0) of naar buiten (focusRichting = 1). De snelheid en de tijdsduur van deze bewerking worden ingesteld met de functies <function>setINDIFocusSpeed()</function> en <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Filterfuncties: Functies voor de besturing van de filterpositie.</para>
<listitem><para>Filterfuncties: Functies voor de besturing van de filterpositie.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString ApparaatNaam, int filter_num)</function> : Verander de filterpositie naar <varname>filter_num</varname>. De gebruiker kan aliassen toekennen aan filternummers in het dialoogvak van <guimenuitem>INDI instellen </guimenuitem> in het menu <guimenu>Apparaten</guimenu> (bijv. Filter 1 = Red (rood), Filter 2 = Green (groen) .. enz.).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString ApparaatNaam, int filter_num)</function> : Verander de filterpositie naar <varname>filter_num</varname>. De gebruiker kan aliassen toekennen aan filternummers in het dialoogvak van <guimenuitem>INDI instellen </guimenuitem> in het menu <guimenu>Apparaten</guimenu> (bijv. Filter 1 = Red (rood), Filter 2 = Green (groen) .. enz.).</para></listitem>
<para>U kunt een lijst van beschikbare &DCOP;-interfaces verkrijgen, gebruik de goede argumenten, zoals in dit voorbeeld getoond: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>U kunt een lijst van beschikbare &DCOP;-interfaces verkrijgen, gebruik de goede argumenten, zoals in dit voorbeeld getoond: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<refpurpose>Controleer of topniveau-taak bestaat.</refpurpose>
<refpurpose>Controleer of topniveau-taak bestaat.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString hastodo(QString taskname)
<synopsis>TQString hastodo(TQString taskname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parameters</title>
<title>Parameters</title>
@ -786,7 +786,7 @@ Afgedrukt op: 2004-07-13 18:10
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
<title>Beschrijving</title>
<title>Beschrijving</title>
<para><function>hastodo(QString taskname)</function> is een &DCOP;-aanroep die een gegeven naam opzoekt. Als deze gevonden wordt, wordt de bijbehorende iCalendar-UID van de taak geretourneerd. Als deze niet gevonden wordt, wordt een lege tekenreeks geretourneerd. </para>
<para><function>hastodo(TQString taskname)</function> is een &DCOP;-aanroep die een gegeven naam opzoekt. Als deze gevonden wordt, wordt de bijbehorende iCalendar-UID van de taak geretourneerd. Als deze niet gevonden wordt, wordt een lege tekenreeks geretourneerd. </para>
<para>Het iCalendar-bestand dat &karm; momenteel open heeft is het bestand dat doorzocht wordt. Alle taakbomen worden doorzocht, niet alleen topniveau taken. Als meer dan één taak een overeenkomende naam heeft, wordt de eerste geretourneerd.</para>
<para>Het iCalendar-bestand dat &karm; momenteel open heeft is het bestand dat doorzocht wordt. Alle taakbomen worden doorzocht, niet alleen topniveau taken. Als meer dan één taak een overeenkomende naam heeft, wordt de eerste geretourneerd.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -800,7 +800,7 @@ Afgedrukt op: 2004-07-13 18:10
<refpurpose>Een nieuwe taak toevoegen.</refpurpose>
<refpurpose>Een nieuwe taak toevoegen.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString todoname)
<synopsis>TQString addtodo(TQString todoname)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parameters</title>
<title>Parameters</title>
@ -817,7 +817,7 @@ Afgedrukt op: 2004-07-13 18:10
<refsect1>
<refsect1>
<title>Beschrijving</title>
<title>Beschrijving</title>
<para><function>addtodo(QString todoname)</function> is een &DCOP;-aanroep die een nieuwe topniveau-taak aan het huidige bestand toevoegt. De UID van de nieuwe taak wordt geretourneerd. </para>
<para><function>addtodo(TQString todoname)</function> is een &DCOP;-aanroep die een nieuwe topniveau-taak aan het huidige bestand toevoegt. De UID van de nieuwe taak wordt geretourneerd. </para>
<para>Dit neemt aan dat u zich in een &kommander;-bestand bevindt en toegang hebt tot de special @pid die het proces-ID bevat. In feite is het eenvoudiger om <quote>kmdr-executor-@pid</quote> door @dcopid te vervangen. Maar u kunt deze syntax (uiteraard zonder de specials) vanaf de opdrachtregel of een willekeurig extern script gebruiken om het &kommander;-venster te wijzigen. </para>
<para>Dit neemt aan dat u zich in een &kommander;-bestand bevindt en toegang hebt tot de special @pid die het proces-ID bevat. In feite is het eenvoudiger om <quote>kmdr-executor-@pid</quote> door @dcopid te vervangen. Maar u kunt deze syntax (uiteraard zonder de specials) vanaf de opdrachtregel of een willekeurig extern script gebruiken om het &kommander;-venster te wijzigen. </para>
<para>Omdat &kommander; geen volledige parser bevat in de alfa-stage, is het gecompliceerder als u de veel snellere interne &DCOP; wilt gebruiken vanuit een ander toepassingsventer (console-&DCOP; is zeer langzaam) omdat u veel informatie moet meegeven, waaronder een prototype van de aanroep. De bovenstaande aanroep zou worden: </para>
<para>Omdat &kommander; geen volledige parser bevat in de alfa-stage, is het gecompliceerder als u de veel snellere interne &DCOP; wilt gebruiken vanuit een ander toepassingsventer (console-&DCOP; is zeer langzaam) omdat u veel informatie moet meegeven, waaronder een prototype van de aanroep. De bovenstaande aanroep zou worden: </para>
<para>Op het moment dat dit geschreven wordt, moet u erop letten dat het nesten van &DCOP;-aanroepen binnen scripttalen (zoals <application>bash</application>) betekent dat u de console-aanroepmethode moet gebruiken. <emphasis>Als u interne &DCOP; gebruikt worden eerst alle &kommander;-specials uitgevoerd en daarna wordt het script uitgevoerd.</emphasis> </para>
<para>Op het moment dat dit geschreven wordt, moet u erop letten dat het nesten van &DCOP;-aanroepen binnen scripttalen (zoals <application>bash</application>) betekent dat u de console-aanroepmethode moet gebruiken. <emphasis>Als u interne &DCOP; gebruikt worden eerst alle &kommander;-specials uitgevoerd en daarna wordt het script uitgevoerd.</emphasis> </para>
<para>Er is een nieuwe vereenvoudigde manier om &DCOP; te gebruiken binnen &kommander; door gebruik te maken van een object-syntaxis. Stel dat u de tekst in een widget genaamd @LineEdit1 wilt wijzigen. Dat ziet er als volgt uit: </para>
<para>Er is een nieuwe vereenvoudigde manier om &DCOP; te gebruiken binnen &kommander; door gebruik te maken van een object-syntaxis. Stel dat u de tekst in een widget genaamd @LineEdit1 wilt wijzigen. Dat ziet er als volgt uit: </para>
<para>Retourneert de waarde van de opgegeven globale variabele. Als een script vanuit een &kommander;-venster wordt uitgevoerd, zullen alle (niet-globale) variabelen die in dat script zijn ingesteld, ophouden te bestaan en zullen daarom niet beschikbaar zijn in andere scriptprocessen of in een nieuwe instantie van het aanroepende proces. De globale <quote>scope</quote> (zichtbaarheid) betekent dat de variabele bestaat in elk proces van dat venster totdat het venster gesloten wordt. U kunt deze variabelen op elk moment wijzigen met een nieuwe aanroep naar <function>@setGlobal</function>. </para>
<para>Retourneert de waarde van de opgegeven globale variabele. Als een script vanuit een &kommander;-venster wordt uitgevoerd, zullen alle (niet-globale) variabelen die in dat script zijn ingesteld, ophouden te bestaan en zullen daarom niet beschikbaar zijn in andere scriptprocessen of in een nieuwe instantie van het aanroepende proces. De globale <quote>scope</quote> (zichtbaarheid) betekent dat de variabele bestaat in elk proces van dat venster totdat het venster gesloten wordt. U kunt deze variabelen op elk moment wijzigen met een nieuwe aanroep naar <function>@setGlobal</function>. </para>
<para>Maakt een variabele aan die globaal is voor het vensterproces en wijst de waarde eraan toe. Deze waarde kan worden opgevraagd met global(QString variableName) of opnieuw ingesteld worden. </para>
<para>Maakt een variabele aan die globaal is voor het vensterproces en wijst de waarde eraan toe. Deze waarde kan worden opgevraagd met global(TQString variableName) of opnieuw ingesteld worden. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString text)</term>
<term>changeWidgetText(TQString text)</term>
<listitem>
<listitem>
<para>Dit zou hernoemd moeten worden naar setWidgetText en deze naam zal mogelijk afgeraden worden. Dit verwijdert de tekst die in de widget wordt weergegeven en vervangt deze door de opgegeven tekst. </para>
<para>Dit zou hernoemd moeten worden naar setWidgetText en deze naam zal mogelijk afgeraden worden. Dit verwijdert de tekst die in de widget wordt weergegeven en vervangt deze door de opgegeven tekst. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString text)</term>
<term>setAssociatedText(TQString text)</term>
<listitem>
<listitem>
<para>Dit stelt de standaard tekenreeks voor de &kommander; Text in. Dit is typisch <quote>@widgetText</quote> om weer te geven wat er in het widget is ingevoerd. Het is onwaarschijnlijk dat u dit vaak nodig hebt, maar het is er voor het geval dat u het nodig hebt. Toepasbaar op alle widgets die data kunnen bevatten. </para>
<para>Dit stelt de standaard tekenreeks voor de &kommander; Text in. Dit is typisch <quote>@widgetText</quote> om weer te geven wat er in het widget is ingevoerd. Het is onwaarschijnlijk dat u dit vaak nodig hebt, maar het is er voor het geval dat u het nodig hebt. Toepasbaar op alle widgets die data kunnen bevatten. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>&DCOP; voor ListBox- en ComboBox-widgets</title>
<title>&DCOP; voor ListBox- en ComboBox-widgets</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString item, int index)</term>
<term>addListItem(TQString item, int index)</term>
<listitem>
<listitem>
<para>Voegt een item aan een ListBox-widget toe op de opgegeven index. De lijstindex begint op nul. Om aan het einde van de lijst toe te voegen gebruikt u -1. </para>
<para>Voegt een item aan een ListBox-widget toe op de opgegeven index. De lijstindex begint op nul. Om aan het einde van de lijst toe te voegen gebruikt u -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString item)</term>
<term>addUniqueItem(TQString item)</term>
<listitem>
<listitem>
<para>addUniqueItem voegt een item aan het einde van de lijst toe alleen als dit nog niet eerder voorkomt. </para>
<para>addUniqueItem voegt een item aan het einde van de lijst toe alleen als dit nog niet eerder voorkomt. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>&DCOP; voor CheckBox- en RadioButton-widgets</title>
<title>&DCOP; voor CheckBox- en RadioButton-widgets</title>
<term><userinput>(?!PATTERN)</userinput> (Negacja zakotwiczenia w przód)</term>
<term><userinput>(?!PATTERN)</userinput> (Negacja zakotwiczenia w przód)</term>
<listitem><para>Zanegowane zakotwiczenie w przód nie dopuści dopasowania wzorca, jeżeli tekst następujący po nim pasuje do <emphasis>PATTERN</emphasis> (wzorca) zakotwiczenia.</para>
<listitem><para>Zanegowane zakotwiczenie w przód nie dopuści dopasowania wzorca, jeżeli tekst następujący po nim pasuje do <emphasis>PATTERN</emphasis> (wzorca) zakotwiczenia.</para>
<para>Wyrażenie <userinput>const \w+\b(?!\s*&)</userinput> pasuje do tekstu <quote>const char</quote> w napisie <quote>const char* foo</quote> ale już nie będzie pasować do <quote>const QString</quote> w <quote>const QString& bar</quote> ponieważ znak <quote>&</quote> pasuje do negacji zakotwiczenia w przód.</para>
<para>Wyrażenie <userinput>const \w+\b(?!\s*&)</userinput> pasuje do tekstu <quote>const char</quote> w napisie <quote>const char* foo</quote> ale już nie będzie pasować do <quote>const TQString</quote> w <quote>const TQString& bar</quote> ponieważ znak <quote>&</quote> pasuje do negacji zakotwiczenia w przód.</para>
@ -501,7 +501,7 @@ Welcome Text = Uruchamianie KDE
<para>Zanim program użytkownika rozpocznie pracę obciążającą procesor lub przed rozpoczęciem jej ładowania itp. należy wywołać &ksplash; w sposób następujący:</para>
<para>Zanim program użytkownika rozpocznie pracę obciążającą procesor lub przed rozpoczęciem jej ładowania itp. należy wywołać &ksplash; w sposób następujący:</para>
<listitem><para>Klasa powinna zawierać definicję statycznej funkcji typu o nazwie <function>names</function> zwracającej listę nazw używanych do uruchamiania wtyczki.</para></listitem>
<listitem><para>Klasa powinna zawierać definicję statycznej funkcji typu o nazwie <function>names</function> zwracającej listę nazw używanych do uruchamiania wtyczki.</para></listitem>
<listitem><para>Jeżeli wtyczka ma być konfigurowana w module centrum sterowania, to kod programu powinien zawierać zdefiniowaną klasę bazującą na klasie <literal>ThemeEngineConfig</literal> umożliwiającą konfigurację wtyczki.</para></listitem>
<listitem><para>Jeżeli wtyczka ma być konfigurowana w module centrum sterowania, to kod programu powinien zawierać zdefiniowaną klasę bazującą na klasie <literal>ThemeEngineConfig</literal> umożliwiającą konfigurację wtyczki.</para></listitem>
<listitem><para>Aby wtyczka mogła funkcjonować, to jej klasa musi zawierać definicję - zastąpienie - co najmniej jednej z następujących funkcji wirtualnych: <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> lub <function>slotUpdateSteps</function>.</para></listitem>
<listitem><para>Aby wtyczka mogła funkcjonować, to jej klasa musi zawierać definicję - zastąpienie - co najmniej jednej z następujących funkcji wirtualnych: <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> lub <function>slotUpdateSteps</function>.</para></listitem>
<listitem><para>Konstruktor powinien być następujący <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> tak aby mógł być wykorzystany przez klasę <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Konstruktor powinien być następujący <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> tak aby mógł być wykorzystany przez klasę <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>Ostatnie wymaganie może wydawać się skomplikowane, jednak jak okaże się to poniżej, poprzez dodanie jednego wiersza to kodu programu, można go praktycznie zignorować.</para>
<para>Ostatnie wymaganie może wydawać się skomplikowane, jednak jak okaże się to poniżej, poprzez dodanie jednego wiersza to kodu programu, można go praktycznie zignorować.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Analizując zawartość powyższego kodu programu zauważyć można następujące elementy. Klasa <classname>Theme2k</classname> została nazwana zgodnie z omawianą wcześniej konwencją nazewniczą, jest potomna względem klasy <classname>ThemeEngine</classname>. Zawiera ona metodę <methodname>Theme2k::names()</methodname> oraz konstruktor obsługujący wymagane parametry wtyczki: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> dodatkowo zdefiniowana została metoda <methodname>Theme2k::slotSetText()</methodname>.Na razie nie należy zwracać uwagi na klasę <classname>RotWidget</classname>, która udostępnia obsługę miłych dla oka elementów interfejsu użytkownika. Omawiana w przykładzie wtyczka jest bardzo prosta, nie wyświetla ona żadnych ikon czy też paska postępu. Jeżeli użytkownik chciałby wyświetlać ikony, to powinien zdefiniować funkcję <function>slotSetPixmap</function>. Istnieją również funkcje określające rozmiar - ilość kroków - paska postępu (<function>slotUpdateSteps</function>) oraz zwiększające pozycję na pasku (<function>slotUpdateProgress</function>) o jeden krok. </para>
<para>Analizując zawartość powyższego kodu programu zauważyć można następujące elementy. Klasa <classname>Theme2k</classname> została nazwana zgodnie z omawianą wcześniej konwencją nazewniczą, jest potomna względem klasy <classname>ThemeEngine</classname>. Zawiera ona metodę <methodname>Theme2k::names()</methodname> oraz konstruktor obsługujący wymagane parametry wtyczki: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> dodatkowo zdefiniowana została metoda <methodname>Theme2k::slotSetText()</methodname>.Na razie nie należy zwracać uwagi na klasę <classname>RotWidget</classname>, która udostępnia obsługę miłych dla oka elementów interfejsu użytkownika. Omawiana w przykładzie wtyczka jest bardzo prosta, nie wyświetla ona żadnych ikon czy też paska postępu. Jeżeli użytkownik chciałby wyświetlać ikony, to powinien zdefiniować funkcję <function>slotSetPixmap</function>. Istnieją również funkcje określające rozmiar - ilość kroków - paska postępu (<function>slotUpdateSteps</function>) oraz zwiększające pozycję na pasku (<function>slotUpdateProgress</function>) o jeden krok. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Kod implementacji wtyczki</title>
<title>Kod implementacji wtyczki</title>
@ -686,7 +686,7 @@ private:
<para>Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> jest zdefiniowane w pliku <filename>kgenericfactory.h</filename>. Kontynuując, ponieważ jest to bardzo prosta wtyczka, to konstruktor klasy jest bardzo prosty.</para>
<para>Makro <constant>K_EXPORT_COMPONENT_FACTORY</constant> jest zdefiniowane w pliku <filename>kgenericfactory.h</filename>. Kontynuując, ponieważ jest to bardzo prosta wtyczka, to konstruktor klasy jest bardzo prosty.</para>
<para>Interfejs <abbrev>DCOP</abbrev> &kstars; posiada następujące funkcje: <itemizedlist>
<para>Interfejs <abbrev>DCOP</abbrev> &kstars; posiada następujące funkcje: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: Argument wskazuje punkt który będzie przybliżany. Może być to nazwa dowolnego obiektu na niebie, lub jeden z następujących wyrazów lub skrótów kierunków: zenith (lub z, zenit), north (n, północ), northeast (ne, północny wschód), east (e, wschód), southeast (se, południowy wschód), south (s, południe), southwest (sw, południowy zachód), west (w, zachód), northwest (nw, północny zachód). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: Argument wskazuje punkt który będzie przybliżany. Może być to nazwa dowolnego obiektu na niebie, lub jeden z następujących wyrazów lub skrótów kierunków: zenith (lub z, zenit), north (n, północ), northeast (ne, północny wschód), east (e, wschód), southeast (se, południowy wschód), south (s, południe), southwest (sw, południowy zachód), west (w, zachód), northwest (nw, północny zachód). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Wskazanie punktu podanego za pomocą współrzędnych równikowych. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Wskazanie punktu podanego za pomocą współrzędnych równikowych. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Wstrzymanie wykonywania skryptu na t sekund. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Wstrzymanie wykonywania skryptu na t sekund. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Wstrzymanie wykonania skryptu do wciśnięcia przez użytkownika określonego klawisza. Nie można jednak czekać na kombinację klawiszy (takich jak <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); tylko pojedyńcze klawisze. Można wpisać <quote>space</quote>,by czekać na klawisz spacji. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Wstrzymanie wykonania skryptu do wciśnięcia przez użytkownika określonego klawisza. Nie można jednak czekać na kombinację klawiszy (takich jak <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); tylko pojedyńcze klawisze. Można wpisać <quote>space</quote>,by czekać na klawisz spacji. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Regulacja widoku. Dostępnych jest wiele opcji; wszystkich ustawień można dokonać w oknie <guilabel>Konfiguracja: &kstars;</guilabel>. Pierwszym argumentem jest nazwa opcji (nazwy są wzięte z pliku konfiguracyjnego <filename>kstarsrc</filename>), drugim argumentem jest żądana wartość. Parser argumentu jest dosyć ścisły, zatem wprowadzenie złego argumentu powoduje błąd. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Regulacja widoku. Dostępnych jest wiele opcji; wszystkich ustawień można dokonać w oknie <guilabel>Konfiguracja: &kstars;</guilabel>. Pierwszym argumentem jest nazwa opcji (nazwy są wzięte z pliku konfiguracyjnego <filename>kstarsrc</filename>), drugim argumentem jest żądana wartość. Parser argumentu jest dosyć ścisły, zatem wprowadzenie złego argumentu powoduje błąd. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Zmiana miejsca obserwacji na podaną lokalizację. Jeżeli podane jako argument miasto nie zostanie znalezione, nie zostanie wykonana żadna czynność. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Zmiana miejsca obserwacji na podaną lokalizację. Jeżeli podane jako argument miasto nie zostanie znalezione, nie zostanie wykonana żadna czynność. </para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function> : Podłącza bądź rozłącza urządzenie INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function> : Podłącza bądź rozłącza urządzenie INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString deviceName, QString port)</function> : Ustawia port komunikacyjny urządzenia.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function> : Ustawia port komunikacyjny urządzenia.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function> : Aktywuje akcję INDI. Akcja może być dowolnym <emphasis>elementem</emphasis> z <emphasis>własności przełączania</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function> : Aktywuje akcję INDI. Akcja może być dowolnym <emphasis>elementem</emphasis> z <emphasis>własności przełączania</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function> : Wstrzymuje wykonanie skryptu aż określona <emphasis>własność</emphasis> zwróci status OK.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function> : Wstrzymuje wykonanie skryptu aż określona <emphasis>własność</emphasis> zwróci status OK.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funkcje teleskopu: Funkcje kontrolujące ruch i stan teleskopu</para>
<listitem><para>Funkcje teleskopu: Funkcje kontrolujące ruch i stan teleskopu</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function> : Ustawia tryb teleskopu lub działanie. Dostępne opcje to SLEW, TRACK, SYNC, PARK i ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function> : Ustawia tryb teleskopu lub działanie. Dostępne opcje to SLEW, TRACK, SYNC, PARK i ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function> : Ustawia cel JNow teleskopu na współrzędne <emphasis>RA</emphasis> i <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function> : Ustawia cel JNow teleskopu na współrzędne <emphasis>RA</emphasis> i <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString deviceName, QString objectName)</function> : Ustawia cel teleskopu JNow na współrzędne wybranego obiektu (<emphasis>objectName</emphasis>. KStars wyszuka nazwę obiektu w bazie danych i pobierze ich RA i Dec.</para></listitem>
<listitem><para><function>setINDITargetName(TQString deviceName, TQString objectName)</function> : Ustawia cel teleskopu JNow na współrzędne wybranego obiektu (<emphasis>objectName</emphasis>. KStars wyszuka nazwę obiektu w bazie danych i pobierze ich RA i Dec.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function> : Ustawia lokalizację teleskopu na określoną długość i szerokość geograficzną. Długość geograficzna jest liczona od Greenwich na wschód. Jednakże mimo tego, że zwykle korzysta się z odwróconych długości geograficznych dla zachodniej półkuli INDI wymaga wartości długości z przedziału od 0 do 360 stopni. Jeżeli więc Twoja długość geograficzna jest ujemna, po prostu dodaj do niej 360 stopni. Na przykład Calgary w Kanadzie ma długość geograficzną: -114 04 58 i szerokość geograficzną: 51 02 58. Tak więc w INDI' te długość geograficzna będzie wynosić 360 - 114.083 = 245.917 stopni.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function> : Ustawia lokalizację teleskopu na określoną długość i szerokość geograficzną. Długość geograficzna jest liczona od Greenwich na wschód. Jednakże mimo tego, że zwykle korzysta się z odwróconych długości geograficznych dla zachodniej półkuli INDI wymaga wartości długości z przedziału od 0 do 360 stopni. Jeżeli więc Twoja długość geograficzna jest ujemna, po prostu dodaj do niej 360 stopni. Na przykład Calgary w Kanadzie ma długość geograficzną: -114 04 58 i szerokość geograficzną: 51 02 58. Tak więc w INDI' te długość geograficzna będzie wynosić 360 - 114.083 = 245.917 stopni.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function> : Ustawia datę i czas UTC teleskopu w formacie ISO 8601. Format ten wygląda następująco: YYYY-MM-DDTHH:MM:SS (np. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function> : Ustawia datę i czas UTC teleskopu w formacie ISO 8601. Format ten wygląda następująco: YYYY-MM-DDTHH:MM:SS (np. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funkcje kamer/CCD: Funkcje kontrolujące właściwości i stan kamer/CCD.</para>
<listitem><para>Funkcje kamer/CCD: Funkcje kontrolujące właściwości i stan kamer/CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function> : Ustawia docelową temperaturę barw matrycy CCD w stopniach Celsjusza.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function> : Ustawia docelową temperaturę barw matrycy CCD w stopniach Celsjusza.</para></listitem>
<listitem><para><function>setINDIFrameType(QString nazwaUrządenia, QString rodzaj)</function> : Ustawia rodzaj ramki CCD. Dostępne opcje to FRAME_LIGHT, FRAME_BIAS, FRAME_DARK i FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString nazwaUrządenia, TQString rodzaj)</function> : Ustawia rodzaj ramki CCD. Dostępne opcje to FRAME_LIGHT, FRAME_BIAS, FRAME_DARK i FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function> : Rozpoczyna ekspozycję, na czas określony przez <emphasis>timeout</emphasis>, w sekundach.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function> : Rozpoczyna ekspozycję, na czas określony przez <emphasis>timeout</emphasis>, w sekundach.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funkcje focusera: funkcje do kontroli ruchu i stanu focusera.</para>
<listitem><para>Funkcje focusera: funkcje do kontroli ruchu i stanu focusera.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function> : Ustawia prędkość focusera. Dostępne opcje to: FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM i FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function> : Ustawia prędkość focusera. Dostępne opcje to: FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM i FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function> : Ustawia czas trwania składowych operacji startINDIFocus w sekundach.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function> : Ustawia czas trwania składowych operacji startINDIFocus w sekundach.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function> : Przesuwa focuser do wewnątrz (focusDir = 0) albo na zewnątrz (focusDir = 1). Prędkość i czas tej operacji są ustawiane przez funkcje <function>setINDIFocusSpeed()</function>i <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function> : Przesuwa focuser do wewnątrz (focusDir = 0) albo na zewnątrz (focusDir = 1). Prędkość i czas tej operacji są ustawiane przez funkcje <function>setINDIFocusSpeed()</function>i <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funkcje filtra: Funkcje kontrolujące pozycję filtra.</para>
<listitem><para>Funkcje filtra: Funkcje kontrolujące pozycję filtra.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function> : Zmiana pozycji filtra na <varname>filter_num</varname>. Użytkownik może przypisać aliasy do numeru filtra w oknie <guimenuitem>Konfiguracja INDI</guimenuitem> z menu <guimenu>Urządzenia</guimenu> (np. Filtr 1 = czerwony, Filtr 2 = zielony itd).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function> : Zmiana pozycji filtra na <varname>filter_num</varname>. Użytkownik może przypisać aliasy do numeru filtra w oknie <guimenuitem>Konfiguracja INDI</guimenuitem> z menu <guimenu>Urządzenia</guimenu> (np. Filtr 1 = czerwony, Filtr 2 = zielony itd).</para></listitem>
<listitem><para>A antevisão negativa evita que uma possível correspondência seja extraída, se a parte subsequente ao texto procurado corresponder ao <emphasis>PADRÃO</emphasis>.</para>
<listitem><para>A antevisão negativa evita que uma possível correspondência seja extraída, se a parte subsequente ao texto procurado corresponder ao <emphasis>PADRÃO</emphasis>.</para>
<para>A expressão <userinput>const \w+\b(?!\s*&)</userinput> irá corresponder com o <quote>const char</quote> do texto <quote>const char* ola</quote>, embora não corresponderá a <quote>const QString</quote> em <quote>const QString& bar</quote> porque o <quote>&</quote> corresponde ao padrão de verificação antecipada negativa.</para>
<para>A expressão <userinput>const \w+\b(?!\s*&)</userinput> irá corresponder com o <quote>const char</quote> do texto <quote>const char* ola</quote>, embora não corresponderá a <quote>const TQString</quote> em <quote>const TQString& bar</quote> porque o <quote>&</quote> corresponde ao padrão de verificação antecipada negativa.</para>
@ -501,7 +501,7 @@ Welcome Text = A carregar o KDE
<para>Antes de a sua aplicação iniciar o seu trabalho intensivo, ou antes de começar a carregar os 'plugins', &etc;, invoke o &ksplash; como se mostra a seguir:</para>
<para>Antes de a sua aplicação iniciar o seu trabalho intensivo, ou antes de começar a carregar os 'plugins', &etc;, invoke o &ksplash; como se mostra a seguir:</para>
if (!(c->send(NomeKSplash, "KSplashIface", "programStarted(QString,QString,QString)", dados))
if (!(c->send(NomeKSplash, "KSplashIface", "programStarted(TQString,TQString,TQString)", dados))
{
{
// Algum processamento de erros aqui.
// Algum processamento de erros aqui.
}
}
@ -596,7 +596,7 @@ X-KSplash-ObjectName=Tema2k
<listitem><para>As classes do 'plugin' deverão oferecer uma função <literal>static</literal> chamada <function>names</function> que devolve uma lista com os nomes pela qual poderá ser invocada.</para></listitem>
<listitem><para>As classes do 'plugin' deverão oferecer uma função <literal>static</literal> chamada <function>names</function> que devolve uma lista com os nomes pela qual poderá ser invocada.</para></listitem>
<listitem><para>Se o 'plugin' puder ser configurado no módulo do centro de controlo, deverá oferecer uma classe baseada na <literal>ThemeEngineConfig</literal> para a configuração.</para></listitem>
<listitem><para>Se o 'plugin' puder ser configurado no módulo do centro de controlo, deverá oferecer uma classe baseada na <literal>ThemeEngineConfig</literal> para a configuração.</para></listitem>
<listitem><para>As classes do 'plugin' deverão reimplementar pelo menos uma das funções virtuais <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> para serem úteis.</para></listitem>
<listitem><para>As classes do 'plugin' deverão reimplementar pelo menos uma das funções virtuais <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> para serem úteis.</para></listitem>
<listitem><para>O construtor deverá ter a forma <literal>ThemeEngine( QWidget *mae, const char *nome, const QStringList &argumentos )</literal> para que possa ser usada com a <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>O construtor deverá ter a forma <literal>ThemeEngine( TQWidget *mae, const char *nome, const QStringList &argumentos )</literal> para que possa ser usada com a <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>O último requisito poderá parecer complicado mas, como veremos mais tarde, ao adicionar uma única linha aos seus ficheiros de código, você poderá normalmente ignorá-lo.</para>
<para>O último requisito poderá parecer complicado mas, como veremos mais tarde, ao adicionar uma única linha aos seus ficheiros de código, você poderá normalmente ignorá-lo.</para>
</sect1>
</sect1>
@ -629,11 +629,11 @@ class Theme2k: public ThemeEngine
<para>Vamos então analisar a listagem em cima. A classe <classname>Theme2k</classname> satisfaz as convenções de nomes e herda da classe <classname>ThemeEngine</classname>. Ela contém um método <methodname>Theme2k::names()</methodname>, e tem um construtor que recebe os parâmetros obrigatórios: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> e também contém um método simples <methodname>Theme2k::slotSetText()</methodname>. De momento, não se preocupe com a classe <classname>RotWidget</classname>. É um pequeno item que oferece alguma beleza visual para o utilizador. O nosso 'plugin' é muito simples e não mostra nenhuns ícones nem nenhuma barra de progresso. Se você quiser mostrar os ícones, implemente de novo a função <function>slotSetPixmap</function>. Existem funções semelhantes para definir o intervalo da barra de progresso (<function>slotUpdateSteps</function>) e para incrementar (<function>slotUpdateProgress</function>) o passo actual. </para>
<para>Vamos então analisar a listagem em cima. A classe <classname>Theme2k</classname> satisfaz as convenções de nomes e herda da classe <classname>ThemeEngine</classname>. Ela contém um método <methodname>Theme2k::names()</methodname>, e tem um construtor que recebe os parâmetros obrigatórios: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> e também contém um método simples <methodname>Theme2k::slotSetText()</methodname>. De momento, não se preocupe com a classe <classname>RotWidget</classname>. É um pequeno item que oferece alguma beleza visual para o utilizador. O nosso 'plugin' é muito simples e não mostra nenhuns ícones nem nenhuma barra de progresso. Se você quiser mostrar os ícones, implemente de novo a função <function>slotSetPixmap</function>. Existem funções semelhantes para definir o intervalo da barra de progresso (<function>slotUpdateSteps</function>) e para incrementar (<function>slotUpdateProgress</function>) o passo actual. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementação do 'plugin'</title>
<title>Implementação do 'plugin'</title>
@ -682,7 +682,7 @@ private:
<para>A macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> é declarada no ficheiro <filename>kgenericfactory.h</filename>. Sigamos para o construtor! Dado que este é um 'plugin' muito simples, assim o é também o construtor.</para>
<para>A macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> é declarada no ficheiro <filename>kgenericfactory.h</filename>. Sigamos para o construtor! Dado que este é um 'plugin' muito simples, assim o é também o construtor.</para>
<para>A interface de <abbrev>DCOP</abbrev> do &kstars; inclui as seguintes funções: <itemizedlist>
<para>A interface de <abbrev>DCOP</abbrev> do &kstars; inclui as seguintes funções: <itemizedlist>
<listitem><para><function> lookTowards( const QString direccao )</function>: Aponta o foco da visualização para uma direcção indicada pelo argumento. Este poderá ser o nome de qualquer objecto no céu ou uma das palavras de direcção: 'zenith' - zénite (ou 'z'), 'north' - norte ('n'), 'northeast' - nordeste (ne), 'east' - este ('e'), 'southeast' - sueste ('se'), 'south' - sul ('s'), 'southwest' - sudoeste ('sw'), 'west' - oeste ('w'), 'northwest' - noroeste ('nw'). </para></listitem>
<listitem><para><function> lookTowards( const TQString direccao )</function>: Aponta o foco da visualização para uma direcção indicada pelo argumento. Este poderá ser o nome de qualquer objecto no céu ou uma das palavras de direcção: 'zenith' - zénite (ou 'z'), 'north' - norte ('n'), 'northeast' - nordeste (ne), 'east' - este ('e'), 'southeast' - sueste ('se'), 'south' - sul ('s'), 'southwest' - sudoeste ('sw'), 'west' - oeste ('w'), 'northwest' - noroeste ('nw'). </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: Aponta o foco da visualização para as coordenadas equatoriais indicadas. </para></listitem>
<listitem><para><function> setRaDec( double ar, double dec )</function>: Aponta o foco da visualização para as coordenadas equatoriais indicadas. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Pára durante 't' segundos antes de continuar com os comandos subsequentes do programa. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Pára durante 't' segundos antes de continuar com os comandos subsequentes do programa. </para></listitem>
<listitem><para><function> waitForKey( const QString t )</function>: Pára a execução do programa até que o utilizador carregue na tecla indicada. Nesta altura, você não poderá indicar combinações de teclas (como o <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); use apenas teclas simples. Você poderá escrever <quote>space</quote> para indicar a barra de espaços. </para></listitem>
<listitem><para><function> waitForKey( const TQString t )</function>: Pára a execução do programa até que o utilizador carregue na tecla indicada. Nesta altura, você não poderá indicar combinações de teclas (como o <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); use apenas teclas simples. Você poderá escrever <quote>space</quote> para indicar a barra de espaços. </para></listitem>
<listitem><para><function> setTracking( bool seguir )</function>: Indica se o modo de seguimento está activo ou não. </para></listitem>
<listitem><para><function> setTracking( bool seguir )</function>: Indica se o modo de seguimento está activo ou não. </para></listitem>
<listitem><para><function> changeViewOption( const QString opcao, const QString valor )</function>: Ajusta uma opção de visualização. Existem dezenas de opções disponíveis; basicamente tudo o que você poderá alterar na <guilabel>Configurar a Janela do &kstars;</guilabel> poderá também aqui ser alterado. O primeiro argumento é o nome da opção (os nomes são extraídos a partir do ficheiro de configuração <filename>kstarsrc</filename>) e o segundo argumento é o valor desejado. O processador dos argumentos está desenhado para ser robusto, por isso se você lhe passar dados inválidos, ele irá falhar de forma ordeira. </para></listitem>
<listitem><para><function> changeViewOption( const TQString opcao, const TQString valor )</function>: Ajusta uma opção de visualização. Existem dezenas de opções disponíveis; basicamente tudo o que você poderá alterar na <guilabel>Configurar a Janela do &kstars;</guilabel> poderá também aqui ser alterado. O primeiro argumento é o nome da opção (os nomes são extraídos a partir do ficheiro de configuração <filename>kstarsrc</filename>) e o segundo argumento é o valor desejado. O processador dos argumentos está desenhado para ser robusto, por isso se você lhe passar dados inválidos, ele irá falhar de forma ordeira. </para></listitem>
<listitem><para><function> setGeoLocation( const QString cidade, const QString provincia, const QString pais )</function>: Muda a localização de observação para a cidade indicada. Se não existir nenhuma cidade que corresponda ao texto dos argumentos, então não acontecerá nada. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString cidade, const TQString provincia, const TQString pais )</function>: Muda a localização de observação para a cidade indicada. Se não existir nenhuma cidade que corresponda ao texto dos argumentos, então não acontecerá nada. </para></listitem>
<listitem><para><function> stop()</function> [relógio]: Pára o relógio da simulação. </para></listitem>
<listitem><para><function> stop()</function> [relógio]: Pára o relógio da simulação. </para></listitem>
<listitem><para>Funções Genéricas do Dispositivo: Funções para estabelecer/desligar os dispositivos, etc.</para>
<listitem><para>Funções Genéricas do Dispositivo: Funções para estabelecer/desligar os dispositivos, etc.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString nomeDispositivo, bool usoLocal)</function> : Estabelece um serviço do INDI quer como local quer como servidor.</para></listitem>
<listitem><para><function>startINDI (TQString nomeDispositivo, bool usoLocal)</function> : Estabelece um serviço do INDI quer como local quer como servidor.</para></listitem>
<listitem><para><function>shutdownINDI (QString nomeDispositivo)</function> : Desliga o serviço do INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString nomeDispositivo)</function> : Desliga o serviço do INDI.</para></listitem>
<listitem><para><function>switchINDI(QString nomeDispositivo, bool ligar)</function> : Liga ou desliga um dispositivo do INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString nomeDispositivo, bool ligar)</function> : Liga ou desliga um dispositivo do INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString nomeDispositivo, QString porto)</function> : Indica o porto de ligação do dispositivo.</para></listitem>
<listitem><para><function>setINDIPort(TQString nomeDispositivo, TQString porto)</function> : Indica o porto de ligação do dispositivo.</para></listitem>
<listitem><para><function>setINDIAction(QString nomeDispositivo, QString accao)</function> : Activa uma acção do INDI. A acção poderá ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString nomeDispositivo, TQString accao)</function> : Activa uma acção do INDI. A acção poderá ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString nomeDispositivo, QString accao)</function> : Coloca a execução do programa em pausa até que a acção <emphasis>propriedade</emphasis> da acção indicada seja devolvida com um estado OK.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString nomeDispositivo, TQString accao)</function> : Coloca a execução do programa em pausa até que a acção <emphasis>propriedade</emphasis> da acção indicada seja devolvida com um estado OK.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções do Telescópio: Funções para controlar o movimento e o estado do telescópio.</para>
<listitem><para>Funções do Telescópio: Funções para controlar o movimento e o estado do telescópio.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString nomeDispositivo, QString accao)</function> : Muda o modo ou a acção do telescópio. As opções disponíveis são a SLEW, TRACK, SYNC, PARK e a ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString nomeDispositivo, TQString accao)</function> : Muda o modo ou a acção do telescópio. As opções disponíveis são a SLEW, TRACK, SYNC, PARK e a ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString nomeDispositivo, double AR, double DEC)</function> : Define as coordenadas-alvo JNow do telescópio para uma dada <emphasis>AR</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString nomeDispositivo, double AR, double DEC)</function> : Define as coordenadas-alvo JNow do telescópio para uma dada <emphasis>AR</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString nomeDispositivo, QString nomeObjecto)</function> : Configura as coordenadas-alvo JNow do telescópio para as coordenadas do <emphasis>nomeObjecto</emphasis>. O KStars irá procurar o nome do objecto na sua base de dados e irá obter a AR e a Dec deste, se for encontrado.</para></listitem>
<listitem><para><function>setINDITargetName(TQString nomeDispositivo, TQString nomeObjecto)</function> : Configura as coordenadas-alvo JNow do telescópio para as coordenadas do <emphasis>nomeObjecto</emphasis>. O KStars irá procurar o nome do objecto na sua base de dados e irá obter a AR e a Dec deste, se for encontrado.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString nomeDispositivo, double longitude, double latitude)</function> : Configura a localização geográfica do telescópio para a latitude e longitude indicadas. A longitude é medida a partir de Greenwich, no Reino-Unido, para Este. Contudo, embora seja comum usar longitudes negativas para o hemisfério ocidental, o INDI está à espera de valores de longitude entre 0 e 360 graus. Como tal, se estiver uma longitude negativa, basta adicionar 360 graus para obter o valor esperado pelo INDI. Por exemplo, as coordenadas de Calgary, no Canadá, correspondem no &kstars; à longitude: -114 04 58 - latitude: 51 02 58. Como tal, o INDI iria necessitar da longitude = 360 - 114,083 = 245,917 graus.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString nomeDispositivo, double longitude, double latitude)</function> : Configura a localização geográfica do telescópio para a latitude e longitude indicadas. A longitude é medida a partir de Greenwich, no Reino-Unido, para Este. Contudo, embora seja comum usar longitudes negativas para o hemisfério ocidental, o INDI está à espera de valores de longitude entre 0 e 360 graus. Como tal, se estiver uma longitude negativa, basta adicionar 360 graus para obter o valor esperado pelo INDI. Por exemplo, as coordenadas de Calgary, no Canadá, correspondem no &kstars; à longitude: -114 04 58 - latitude: 51 02 58. Como tal, o INDI iria necessitar da longitude = 360 - 114,083 = 245,917 graus.</para></listitem>
<listitem><para><function>setINDIUTC(QString nomeDispositivo, QString dataHomeUTC)</function> : Configura a data e hora UTC do telescópio no formato ISO 8601. O formato é igual a AAAA-MM-DDTHH:MM:SS (p.ex. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString nomeDispositivo, TQString dataHomeUTC)</function> : Configura a data e hora UTC do telescópio no formato ISO 8601. O formato é igual a AAAA-MM-DDTHH:MM:SS (p.ex. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções da Câmara/CCD: Funções para controlar as propriedades e o estado da câmara/CCD.</para>
<listitem><para>Funções da Câmara/CCD: Funções para controlar as propriedades e o estado da câmara/CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString nomeDispositivo, int temp)</function> : Configura a temperatura-alvo do 'chip' CCD em graus Celsius (centígrados).</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString nomeDispositivo, int temp)</function> : Configura a temperatura-alvo do 'chip' CCD em graus Celsius (centígrados).</para></listitem>
<listitem><para><function>setINDIFrameType(QString nomeDispositivo, QString tipo)</function> : Configura o tipo de imagem do CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK e FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString nomeDispositivo, TQString tipo)</function> : Configura o tipo de imagem do CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK e FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString nomeDispositivo, int tempoLimite)</function> : Inicia a exposição do CCD/Câmara durante o período em segundos indicado em <emphasis>tempoLimite</emphasis>.</para></listitem>
<listitem><para><function>startINDIExposure(TQString nomeDispositivo, int tempoLimite)</function> : Inicia a exposição do CCD/Câmara durante o período em segundos indicado em <emphasis>tempoLimite</emphasis>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções do Sistema de Foco: Funções para controlar o movimento e o estado do sistema de foco.</para>
<listitem><para>Funções do Sistema de Foco: Funções para controlar o movimento e o estado do sistema de foco.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString nomeDispositivo, QString accao)</function> : Configura a velocidade do sistema de foco. As opções disponíveis são a FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM e a FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString nomeDispositivo, TQString accao)</function> : Configura a velocidade do sistema de foco. As opções disponíveis são a FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM e a FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString nomeDispositivo, int tempoLimite)</function> : Configura a duração em segundos para quaisquer operações subsequentes do 'startINDIFocus'.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString nomeDispositivo, int tempoLimite)</function> : Configura a duração em segundos para quaisquer operações subsequentes do 'startINDIFocus'.</para></listitem>
<listitem><para><function>startINDIFocus(QString nomeDispositivo, int dirFoco)</function> : Move o sistema de foco quer para dentro (dirFoco = 0) quer para fora (dirFoco = 1). A velocidade e a duração desta operação é definida pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString nomeDispositivo, int dirFoco)</function> : Move o sistema de foco quer para dentro (dirFoco = 0) quer para fora (dirFoco = 1). A velocidade e a duração desta operação é definida pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções do Filtro: Funções para controlar a posição do filtro.</para>
<listitem><para>Funções do Filtro: Funções para controlar a posição do filtro.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString nomeDispositivo, int num_filtro)</function> : Muda a posição do filtro para <varname>num_filtro</varname>. O utilizador poderá atribuir nomes alternativos aos números dos filtros na janela para <guimenuitem>Configurar o INDI</guimenuitem>, no menu <guimenu>Dispositivos</guimenu> (p.ex. Filtro 1 = Vermelho, Filtro 2 = Verde..etc).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString nomeDispositivo, int num_filtro)</function> : Muda a posição do filtro para <varname>num_filtro</varname>. O utilizador poderá atribuir nomes alternativos aos números dos filtros na janela para <guimenuitem>Configurar o INDI</guimenuitem>, no menu <guimenu>Dispositivos</guimenu> (p.ex. Filtro 1 = Vermelho, Filtro 2 = Verde..etc).</para></listitem>
<para>Você poderá obter uma lista das interfaces de &DCOP; disponíveis e usar os argumentos correctos, como é demonstrado neste exemplo: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Você poderá obter uma lista das interfaces de &DCOP; disponíveis e usar os argumentos correctos, como é demonstrado neste exemplo: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>é algo diferente de fazer uma referência a um ponteiro NULL. Você não indicou ao objecto de todo o que ele é, e agora irá tentar usá-lo. A questão aqui é que você deseja ter uma instância local de um objecto Arts::Synth_PLAY. Claro que você poderá querer ter algo diferente (como criar o objecto noutro local qualquer, ou usar um objecto remoto existente). Contudo, é um atalho conveniente para criar objectos. A criação tardia não irá funcionar logo que tenha atribuído outra coisa qualquer (como por exemplo uma referência nula). </para>
<para>é algo diferente de fazer uma referência a um ponteiro NULL. Você não indicou ao objecto de todo o que ele é, e agora irá tentar usá-lo. A questão aqui é que você deseja ter uma instância local de um objecto Arts::Synth_PLAY. Claro que você poderá querer ter algo diferente (como criar o objecto noutro local qualquer, ou usar um objecto remoto existente). Contudo, é um atalho conveniente para criar objectos. A criação tardia não irá funcionar logo que tenha atribuído outra coisa qualquer (como por exemplo uma referência nula). </para>
<para>Os termos equivalentes em C++ seriam <programlisting>
<para>Os termos equivalentes em C++ seriam <programlisting>
QWidget* janela;
TQWidget* janela;
janela->show();
janela->show();
</programlisting> o que obviamente, em C++, iria dar um estoiro garantido. Por isso, isto é diferente aqui. Esta criação tardia é enganadora, porque não quer dizer que exista necessariamente uma implementação para a sua interface. </para>
</programlisting> o que obviamente, em C++, iria dar um estoiro garantido. Por isso, isto é diferente aqui. Esta criação tardia é enganadora, porque não quer dizer que exista necessariamente uma implementação para a sua interface. </para>
<para>Não existe necessidade de basear uma plataforma de multimédia no &Qt;. Ao decidir isso, e usando toda aquela serialização e outras funcionalidades giras do &Qt;, iria conduzir facilmente a que a plataforma se tornasse apenas para o &Qt; ou (para apenas para o &kde;). Quer dizer: assim que se vir que os GNOMEs comecem a usar o &DCOP;, também, ou algo do género, provavelmente o autor ficará errado. </para>
<para>Não existe necessidade de basear uma plataforma de multimédia no &Qt;. Ao decidir isso, e usando toda aquela serialização e outras funcionalidades giras do &Qt;, iria conduzir facilmente a que a plataforma se tornasse apenas para o &Qt; ou (para apenas para o &kde;). Quer dizer: assim que se vir que os GNOMEs comecem a usar o &DCOP;, também, ou algo do género, provavelmente o autor ficará errado. </para>
<para>Enquanto se sabe que o &DCOP; basicamente não sabe nada sobre os tipos de dados que envia, de modo que você poderia usar o &DCOP; sem usar o &Qt;, veja como é que é usado na utilização do dia-a-dia do &kde;: as pessoas enviam tipos como o <classname>QString</classname>, o <classname>QRect</classname>, o <classname>QPixmap</classname>, o <classname>QCString</classname>, ..., de um lado para o outro. Estes usam a serialização do &Qt;. Por isso, se alguém optar por suportar o &DCOP; num programa do GNOME, ele teria de afirmar que usava os tipos <classname>QString</classname>,... (ainda que não o faça, de facto) e emular a forma como o &Qt; faz a transmissão, ou então teria de enviar outros tipos de cadeias de caracteres, imagens e rectângulos, o que deixaria de ter possibilidades de interoperabilidade. </para>
<para>Enquanto se sabe que o &DCOP; basicamente não sabe nada sobre os tipos de dados que envia, de modo que você poderia usar o &DCOP; sem usar o &Qt;, veja como é que é usado na utilização do dia-a-dia do &kde;: as pessoas enviam tipos como o <classname>TQString</classname>, o <classname>QRect</classname>, o <classname>QPixmap</classname>, o <classname>QCString</classname>, ..., de um lado para o outro. Estes usam a serialização do &Qt;. Por isso, se alguém optar por suportar o &DCOP; num programa do GNOME, ele teria de afirmar que usava os tipos <classname>TQString</classname>,... (ainda que não o faça, de facto) e emular a forma como o &Qt; faz a transmissão, ou então teria de enviar outros tipos de cadeias de caracteres, imagens e rectângulos, o que deixaria de ter possibilidades de interoperabilidade. </para>
<para>Bem, seja o que for, o &arts; pretendeu sempre funcionar com ou sem o &kde;, com ou sem o &Qt;, com ou sem o X11, e talvez com ou sem o &Linux; (e não há problema nenhum com as pessoas que o transpõem para um sistema operativo proprietário conhecido). </para>
<para>Bem, seja o que for, o &arts; pretendeu sempre funcionar com ou sem o &kde;, com ou sem o &Qt;, com ou sem o X11, e talvez com ou sem o &Linux; (e não há problema nenhum com as pessoas que o transpõem para um sistema operativo proprietário conhecido). </para>
@ -1833,11 +1833,11 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>escalonar uma nova mensagem de alarme.</refpurpose>
<refpurpose>escalonar uma nova mensagem de alarme.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>bool scheduleMessage(const QString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, const QColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleMessage(const TQString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, const TQColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleMessage(const QString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, const QColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleMessage(const TQString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, const TQColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleMessage(const QString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, const QColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
<synopsis>bool scheduleMessage(const TQString& <replaceable>mensagem</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, const TQColor& <replaceable>texto</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opções</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
@ -1874,7 +1874,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>fundo</parameter></term>
<term><parameter>fundo</parameter></term>
<listitem>
<listitem>
<para>Indica a cor de fundo usada para mostrar a mensagem. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>QColor::name()</methodname>) onde o RR, GG and BB são valores de dois algarismos em hexadecimal para o vermelho, verde e azul. Em alternativa, o texto poderá ser qualquer um dos outros formatos aceites pelo <methodname>QColor::setNamedColor()</methodname>, como o nome de uma cor na base de dados de cores do X (⪚ <quote>red</quote> ou <quote>steelblue</quote>). Ponha o texto vazio para indicar a cor de fundo por omissão actual.</para>
<para>Indica a cor de fundo usada para mostrar a mensagem. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>TQColor::name()</methodname>) onde o RR, GG and BB são valores de dois algarismos em hexadecimal para o vermelho, verde e azul. Em alternativa, o texto poderá ser qualquer um dos outros formatos aceites pelo <methodname>TQColor::setNamedColor()</methodname>, como o nome de uma cor na base de dados de cores do X (⪚ <quote>red</quote> ou <quote>steelblue</quote>). Ponha o texto vazio para indicar a cor de fundo por omissão actual.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -1975,11 +1975,11 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>agendar um novo alarme que mostra o conteúdo de um ficheiro de texto ou de imagem.</refpurpose>
<refpurpose>agendar um novo alarme que mostra o conteúdo de um ficheiro de texto ou de imagem.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>bool scheduleFile(const QString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleFile(const TQString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleFile(const QString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleFile(const TQString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleFile(const QString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const QColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const QString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
<synopsis>bool scheduleFile(const TQString& <replaceable>URL</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, const TQColor& <replaceable>fundo</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, const TQString& <replaceable>urlAudio</replaceable>, int <replaceable>chamadaAtencao</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
@ -2016,7 +2016,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>fundo</parameter></term>
<term><parameter>fundo</parameter></term>
<listitem>
<listitem>
<para>Indica a cor de fundo usada para mostrar o ficheiro. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>QColor::name()</methodname>) onde o RR, GG and BB são valores de dois algarismos em hexadecimal para o vermelho, verde e azul. Em alternativa, o texto poderá ser qualquer um dos formatos aceites pelo <methodname>QColor::setNamedColor()</methodname>, com o nome de uma cor na base de dados de cores do X (⪚ <quote>red</quote> ou <quote>steelblue</quote>). Ponha o texto vazio para indicar a cor de fundo por omissão actual.</para>
<para>Indica a cor de fundo usada para mostrar o ficheiro. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>TQColor::name()</methodname>) onde o RR, GG and BB são valores de dois algarismos em hexadecimal para o vermelho, verde e azul. Em alternativa, o texto poderá ser qualquer um dos formatos aceites pelo <methodname>TQColor::setNamedColor()</methodname>, com o nome de uma cor na base de dados de cores do X (⪚ <quote>red</quote> ou <quote>steelblue</quote>). Ponha o texto vazio para indicar a cor de fundo por omissão actual.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2102,11 +2102,11 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>agenda um novo alarme que executa um determinado comando.</refpurpose>
<refpurpose>agenda um novo alarme que executa um determinado comando.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>bool scheduleCommand(const QString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleCommand(const TQString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleCommand(const QString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleCommand(const TQString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleCommand(const QString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
<synopsis>bool scheduleCommand(const TQString& <replaceable>linhaComandos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
@ -2208,11 +2208,11 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>agenda um novo alarme que envia uma mensagem de e-mail.</refpurpose>
<refpurpose>agenda um novo alarme que envia uma mensagem de e-mail.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>bool scheduleEmail(const QString& <replaceable>idRemetente</replaceable>, const QString& <replaceable>enderecos</replaceable>, const QString& <replaceable>assunto</replaceable>, const QString& <replaceable>mensagem</replaceable>, const QString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleEmail(const TQString& <replaceable>idRemetente</replaceable>, const TQString& <replaceable>enderecos</replaceable>, const TQString& <replaceable>assunto</replaceable>, const TQString& <replaceable>mensagem</replaceable>, const TQString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleEmail(const QString& <replaceable>idRemetente</replaceable>, const QString& <replaceable>enderecos</replaceable>, const QString& <replaceable>assunto</replaceable>, const QString& <replaceable>mensagem</replaceable>, const QString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
<synopsis>bool scheduleEmail(const TQString& <replaceable>idRemetente</replaceable>, const TQString& <replaceable>enderecos</replaceable>, const TQString& <replaceable>assunto</replaceable>, const TQString& <replaceable>mensagem</replaceable>, const TQString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, int <replaceable>numeroRepeticoes</replaceable>)
</synopsis>
</synopsis>
<synopsis>bool scheduleEmail(const QString& <replaceable>idRemetente</replaceable>, const QString& <replaceable>enderecos</replaceable>, const QString& <replaceable>assunto</replaceable>, const QString& <replaceable>mensagem</replaceable>, const QString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
<synopsis>bool scheduleEmail(const TQString& <replaceable>idRemetente</replaceable>, const TQString& <replaceable>enderecos</replaceable>, const TQString& <replaceable>assunto</replaceable>, const TQString& <replaceable>mensagem</replaceable>, const TQString& <replaceable>anexos</replaceable>, const QDateTime& <replaceable>dataHora</replaceable>, int <replaceable>cancelarSeAtrasado</replaceable>, int <replaceable>opcoes</replaceable>, int <replaceable>tipoRepeticaoSimples</replaceable>, int <replaceable>intervalo</replaceable>, const QDateTime& <replaceable>dataFim</replaceable>)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
@ -2341,7 +2341,7 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>Mostra a <link linkend="alarm-edit-dlg">janela de edição do alarme</link> para editar um alarme.</refpurpose>
<refpurpose>Mostra a <link linkend="alarm-edit-dlg">janela de edição do alarme</link> para editar um alarme.</refpurpose>
<refpurpose>Devolve a versão do &karm;.</refpurpose>
<refpurpose>Devolve a versão do &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString version()
<synopsis>TQString version()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -752,7 +752,7 @@ Impresso a: 2004-07-13 18:10
<refpurpose>Sai do &karm;.</refpurpose>
<refpurpose>Sai do &karm;.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString quit()
<synopsis>TQString quit()
</synopsis>
</synopsis>
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
@ -770,7 +770,7 @@ Impresso a: 2004-07-13 18:10
<refpurpose>Verifica se o item por-fazer de topo existe.</refpurpose>
<refpurpose>Verifica se o item por-fazer de topo existe.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString hastodo(QString nomeTarefa)
<synopsis>TQString hastodo(TQString nomeTarefa)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parâmetros</title>
<title>Parâmetros</title>
@ -786,7 +786,7 @@ Impresso a: 2004-07-13 18:10
</refsynopsisdiv>
</refsynopsisdiv>
<refsect1>
<refsect1>
<title>Descrição</title>
<title>Descrição</title>
<para>O <function>hastodo(QString nomeTarefa)</function> é uma chamada de &DCOP; que procura por um item por-fazer com o nome indicado. Se for encontrado, devolve o UID do iCalendar que identifica este item. Se não for encontrado, devolve um texto vazio. </para>
<para>O <function>hastodo(TQString nomeTarefa)</function> é uma chamada de &DCOP; que procura por um item por-fazer com o nome indicado. Se for encontrado, devolve o UID do iCalendar que identifica este item. Se não for encontrado, devolve um texto vazio. </para>
<para>O ficheiro iCalendar que o &karm; tem aberto de momento é o ficheiro que será pesquisado. Todas as árvores de itens por-fazer serão pesquisadas, não apenas os de topo. Se mais do que um item por-fazer corresponder a esse nome, será devolvido o primeiro.</para>
<para>O ficheiro iCalendar que o &karm; tem aberto de momento é o ficheiro que será pesquisado. Todas as árvores de itens por-fazer serão pesquisadas, não apenas os de topo. Se mais do que um item por-fazer corresponder a esse nome, será devolvido o primeiro.</para>
</refsect1>
</refsect1>
</refentry>
</refentry>
@ -800,7 +800,7 @@ Impresso a: 2004-07-13 18:10
<refpurpose>Adiciona um novo item por-fazer.</refpurpose>
<refpurpose>Adiciona um novo item por-fazer.</refpurpose>
</refnamediv>
</refnamediv>
<refsynopsisdiv>
<refsynopsisdiv>
<synopsis>QString addtodo(QString nomeItem)
<synopsis>TQString addtodo(TQString nomeItem)
</synopsis>
</synopsis>
<refsect2>
<refsect2>
<title>Parâmetros</title>
<title>Parâmetros</title>
@ -817,7 +817,7 @@ Impresso a: 2004-07-13 18:10
<refsect1>
<refsect1>
<title>Descrição</title>
<title>Descrição</title>
<para>O <function>addtodo(QString nomeItem)</function> é uma chamada de &DCOP; que adiciona um item por-fazer de topo novo ao ficheiro actual. É devolvido o UID do novo item por-fazer. </para>
<para>O <function>addtodo(TQString nomeItem)</function> é uma chamada de &DCOP; que adiciona um item por-fazer de topo novo ao ficheiro actual. É devolvido o UID do novo item por-fazer. </para>
<para>O segundo objecto do nosso programa é o botão, uma instância da classe <classname>QPushButton</classname>. A partir dos dois construtores fornecidos para criar uma instância, nós optámos pelo segundo: este aceita um texto, o qual é o conteúdo do texto do botão; neste caso, é o texto "Olá mundo!". Aí, chamou-se o método <methodname>resize()</methodname> para alterar as dimensões do botão de acordo com o seu conteúdo - o botão tem de ser maior para tornar o texto completamente visível. </para>
<para>O segundo objecto do nosso programa é o botão, uma instância da classe <classname>QPushButton</classname>. A partir dos dois construtores fornecidos para criar uma instância, nós optámos pelo segundo: este aceita um texto, o qual é o conteúdo do texto do botão; neste caso, é o texto "Olá mundo!". Aí, chamou-se o método <methodname>resize()</methodname> para alterar as dimensões do botão de acordo com o seu conteúdo - o botão tem de ser maior para tornar o texto completamente visível. </para>
<para>Mas e o método <methodname>show()</methodname>? Agora, você verá que, como a maioria dos outros itens, a classe <classname>QPushButton</classname> baseia-se numa herança simples ou, como diz a documentação, herda de <classname>QButton</classname>. Siga a referência à classe <classname>QButton</classname>. Isto mostra-lhe que bastantes outros itens herdados pela <classname>QPushButton</classname>, os quais iremos usar posteriormente para explicar o mecanismo de 'signals'/'slots' De qualquer forma, o método <methodname>show()</methodname> não aparece, como tal, deverá ser um método que é fornecido por herança, da mesma forma. A classe que a <classname>QButton</classname> herda é a <classname>QWidget</classname>. Siga de novo a ligação e você irá ver um conjunto enorme de classes que a <classname>QWidget</classname> oferece, incluindo o método <methodname>show()</methodname>. Agora dá para perceber o que foi feito no exemplo com o botão: <orderedlist>
<para>Mas e o método <methodname>show()</methodname>? Agora, você verá que, como a maioria dos outros itens, a classe <classname>QPushButton</classname> baseia-se numa herança simples ou, como diz a documentação, herda de <classname>QButton</classname>. Siga a referência à classe <classname>QButton</classname>. Isto mostra-lhe que bastantes outros itens herdados pela <classname>QPushButton</classname>, os quais iremos usar posteriormente para explicar o mecanismo de 'signals'/'slots' De qualquer forma, o método <methodname>show()</methodname> não aparece, como tal, deverá ser um método que é fornecido por herança, da mesma forma. A classe que a <classname>QButton</classname> herda é a <classname>TQWidget</classname>. Siga de novo a ligação e você irá ver um conjunto enorme de classes que a <classname>TQWidget</classname> oferece, incluindo o método <methodname>show()</methodname>. Agora dá para perceber o que foi feito no exemplo com o botão: <orderedlist>
<listitem><para>Cria uma instância de <classname>QPushButton</classname>, utiliza o segundo construtor para configurar o texto do botão</para></listitem>
<listitem><para>Cria uma instância de <classname>QPushButton</classname>, utiliza o segundo construtor para configurar o texto do botão</para></listitem>
<listitem><para>Muda o tamanho do 'widget' de acordo com o seu conteúdo</para></listitem>
<listitem><para>Muda o tamanho do 'widget' de acordo com o seu conteúdo</para></listitem>
<listitem><para>Escolhe o 'widget' como o 'widget' principal da instância do <classname>QApplication</classname> como</para></listitem>
<listitem><para>Escolhe o 'widget' como o 'widget' principal da instância do <classname>QApplication</classname> como</para></listitem>
<listitem><para>Diz ao 'widget' para se mostrar no ecrã chamando <methodname>show()</methodname>, um método herdado de <classname>QWidget</classname></para></listitem>
<listitem><para>Diz ao 'widget' para se mostrar no ecrã chamando <methodname>show()</methodname>, um método herdado de <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Depois de invocar o método <methodname>exec()</methodname>, a aplicação fica visível para o utilizador, mostrando uma janela com o botão a dizer "Olá mundo!". Nota: os programas gráficos comportam-se de forma ligeiramente diferente da das aplicações procedimentais. A questão principal aqui é que a aplicação entra num estado chamado de "ciclo de eventos principal". Isto significa que o programa tem de esperar pelas acções do utilizador e então reagir a elas e que, numa aplicação do Qt, o programa terá de entrar no ciclo de eventos principal para conseguir começar a tratá-los. A próxima secção diz-lhe em resumo o que isto significa para o programador e o que é que o Qt oferece para processar os eventos do utilizador. </para>
<para>Depois de invocar o método <methodname>exec()</methodname>, a aplicação fica visível para o utilizador, mostrando uma janela com o botão a dizer "Olá mundo!". Nota: os programas gráficos comportam-se de forma ligeiramente diferente da das aplicações procedimentais. A questão principal aqui é que a aplicação entra num estado chamado de "ciclo de eventos principal". Isto significa que o programa tem de esperar pelas acções do utilizador e então reagir a elas e que, numa aplicação do Qt, o programa terá de entrar no ciclo de eventos principal para conseguir começar a tratá-los. A próxima secção diz-lhe em resumo o que isto significa para o programador e o que é que o Qt oferece para processar os eventos do utilizador. </para>
<note><para>Para os utilizadores já avançados: O botão não tem nenhuma janela-mãe declarada no construtor, o que significa que é um item gráfico de topo por si só e corre num ciclo de eventos local que não precisa de esperar pelo ciclo de eventos principal. Veja a documentação da classe QWidget e o Guia de Referência da Biblioteca do KDE</para>
<note><para>Para os utilizadores já avançados: O botão não tem nenhuma janela-mãe declarada no construtor, o que significa que é um item gráfico de topo por si só e corre num ciclo de eventos local que não precisa de esperar pelo ciclo de eventos principal. Veja a documentação da classe TQWidget e o Guia de Referência da Biblioteca do KDE</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Agora vamos dar "vida" à aplicação, processando os eventos do utilizador. De um modo geral, o utilizador tem duas formas de interagir com um programa: o rato e o teclado. Para ambas as formas, uma interface gráfica tem de fornecer métodos que detectem as acções e métodos que façam algo em reacção a estas acções. </para>
<para>Agora vamos dar "vida" à aplicação, processando os eventos do utilizador. De um modo geral, o utilizador tem duas formas de interagir com um programa: o rato e o teclado. Para ambas as formas, uma interface gráfica tem de fornecer métodos que detectem as acções e métodos que façam algo em reacção a estas acções. </para>
<para>O sistema de janelas envia deste modo todos os eventos de interacção para a aplicação respectiva. A <classname>QApplication</classname> envia-os então para a janela activa como um <classname>QEvent</classname> e os próprios itens terão de decidir o que fazer com eles. Um item recebe o evento e processa o <methodname>QWidget::event(QEvent*)</methodname>, que decide então qual o evento que foi executado e como reagir; o <methodname>event()</methodname> é deste modo o tratador de eventos principal. Aí, o método <methodname>event()</methodname> passa o evento para os denominados de filtros de eventos que determinam o que se passou e o que fazer com o evento. Se nenhum filtro responder como responsável pelo evento, os tratadores de eventos especializados são invocados. Deste modo, pode-se optar entre: <itemizedlist>
<para>O sistema de janelas envia deste modo todos os eventos de interacção para a aplicação respectiva. A <classname>QApplication</classname> envia-os então para a janela activa como um <classname>QEvent</classname> e os próprios itens terão de decidir o que fazer com eles. Um item recebe o evento e processa o <methodname>TQWidget::event(QEvent*)</methodname>, que decide então qual o evento que foi executado e como reagir; o <methodname>event()</methodname> é deste modo o tratador de eventos principal. Aí, o método <methodname>event()</methodname> passa o evento para os denominados de filtros de eventos que determinam o que se passou e o que fazer com o evento. Se nenhum filtro responder como responsável pelo evento, os tratadores de eventos especializados são invocados. Deste modo, pode-se optar entre: <itemizedlist>
<listitem><para>Eventos de teclados -- teclas TAB e Shift-TAB:</para>
<listitem><para>Eventos de teclados -- teclas TAB e Shift-TAB:</para>
<para>Lembre-se que todas as funções de eventos são virtuais e protegidas; como tal, você poderá reimplementar os eventos que necessitar nos seus próprios itens gráficos e indicar como é que o seu item terá de reagir. O <classname>QWidget</classname> contém também outros métodos virtuais que poderão ser úteis nos seus programas; de qualquer forma, é suficiente conhecer o <classname>QWidget</classname> bastante bem. </para>
<para>Lembre-se que todas as funções de eventos são virtuais e protegidas; como tal, você poderá reimplementar os eventos que necessitar nos seus próprios itens gráficos e indicar como é que o seu item terá de reagir. O <classname>TQWidget</classname> contém também outros métodos virtuais que poderão ser úteis nos seus programas; de qualquer forma, é suficiente conhecer o <classname>TQWidget</classname> bastante bem. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Interacção de Objectos através de 'Signals' e 'Slots'</title>
<title>Interacção de Objectos através de 'Signals' e 'Slots'</title>
<para>Agora chegámos às vantagens mais óbvias da plataforma do Qt: o mecanismo de 'signals'/'slots'. Isto oferece uma solução bastante útil e fácil de os objectos interagirem entre si, o que normalmente é resolvido por funções de resposta ('callback') pelas bibliotecas do X-Window. Dado que esta documentação necessita de uma programação restrita e normalmente torna a criação de interface do utilizador muito complicada (como é referido pela documentação do Qt e é explicado no texto 'Programming with Qt' de K.Dalheimer), a Troll Tech inventou um novo sistema onde os objectos podem emitir sinais ('signals') que podem estar associados a métodos denominados por 'slots'. Para a parte de C++ do programador, ele só terá de conhecer algumas coisas sobre este mecanismo: <itemizedlist>
<para>Agora chegámos às vantagens mais óbvias da plataforma do Qt: o mecanismo de 'signals'/'slots'. Isto oferece uma solução bastante útil e fácil de os objectos interagirem entre si, o que normalmente é resolvido por funções de resposta ('callback') pelas bibliotecas do X-Window. Dado que esta documentação necessita de uma programação restrita e normalmente torna a criação de interface do utilizador muito complicada (como é referido pela documentação do Qt e é explicado no texto 'Programming with Qt' de K.Dalheimer), a Troll Tech inventou um novo sistema onde os objectos podem emitir sinais ('signals') que podem estar associados a métodos denominados por 'slots'. Para a parte de C++ do programador, ele só terá de conhecer algumas coisas sobre este mecanismo: <itemizedlist>
<listitem><para>a declaração de uma classe que utilize 'signals'/'slots' tem que ter a macro TQ_OBJECT no início (sem ponto e vírgula); e tem que ser derivada da classe <classname>QObject</classname> </para></listitem>
<listitem><para>a declaração de uma classe que utilize 'signals'/'slots' tem que ter a macro TQ_OBJECT no início (sem ponto e vírgula); e tem que ser derivada da classe <classname>TQObject</classname> </para></listitem>
<listitem><para>um 'signal' pode ser emitido através da palavra chave 'emit', por exemplo, emit signal(parâmetros);, de qualquer método membro de uma classe que permite 'signals'/'slots' </para></listitem>
<listitem><para>um 'signal' pode ser emitido através da palavra chave 'emit', por exemplo, emit signal(parâmetros);, de qualquer método membro de uma classe que permite 'signals'/'slots' </para></listitem>
<listitem><para>todos os 'signals' utilizados pelas classes que não são herdados tem que ser adicionados à declaração da classe numa secção 'signals' </para></listitem>
<listitem><para>todos os 'signals' utilizados pelas classes que não são herdados tem que ser adicionados à declaração da classe numa secção 'signals' </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>o compilador de meta-objectos 'moc' tem de correr sobre o ficheiro de inclusão para expandir as macros e para produzir a implementação (que é necessário conhecer). Os ficheiros de resultado do 'moc' são compilados também pelo compilador de C++. </para></listitem>
<listitem><para>o compilador de meta-objectos 'moc' tem de correr sobre o ficheiro de inclusão para expandir as macros e para produzir a implementação (que é necessário conhecer). Os ficheiros de resultado do 'moc' são compilados também pelo compilador de C++. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Outra forma de usar os 'signals' sem derivar da classe <classname>QObject</classname> é usar a classe <classname>QSignal</classname> - veja a documentação de referência para mais informações e para um exemplo de utilização. No seguinte, assume-se que você vai derivar de <classname>QObject</classname>. </para>
<para>Outra forma de usar os 'signals' sem derivar da classe <classname>TQObject</classname> é usar a classe <classname>QSignal</classname> - veja a documentação de referência para mais informações e para um exemplo de utilização. No seguinte, assume-se que você vai derivar de <classname>TQObject</classname>. </para>
<para>Desta forma, a sua classe é capaz de enviar 'signals' para todo o lado e consegue fornecer 'slots' aos quais os 'signals' se possam ligar. Usando os 'signals', você não terá de se preocupar com que os recebe - só tem de emitir os 'signals' e qual o 'slot' que lhe deseja ligar para reagir à emissão. Os 'slots' também podem ser usados como métodos normais durante a implementação. </para>
<para>Desta forma, a sua classe é capaz de enviar 'signals' para todo o lado e consegue fornecer 'slots' aos quais os 'signals' se possam ligar. Usando os 'signals', você não terá de se preocupar com que os recebe - só tem de emitir os 'signals' e qual o 'slot' que lhe deseja ligar para reagir à emissão. Os 'slots' também podem ser usados como métodos normais durante a implementação. </para>
<para>Agora, para ligar um 'signal' a um 'slot', você terá de usar os métodos <methodname>connect()</methodname> que são fornecidos pelo <classname>QObject</classname> ou, quando for possível, os métodos especiais que os objectos fornecem para definir a ligação a um dado 'signal'. </para>
<para>Agora, para ligar um 'signal' a um 'slot', você terá de usar os métodos <methodname>connect()</methodname> que são fornecidos pelo <classname>TQObject</classname> ou, quando for possível, os métodos especiais que os objectos fornecem para definir a ligação a um dado 'signal'. </para>
<sect3 id="c1s2s4s1">
<sect3 id="c1s2s4s1">
<title>Exemplo de Utilização</title>
<title>Exemplo de Utilização</title>
@ -262,9 +262,9 @@ return a.exec();
}
}
</programlisting>
</programlisting>
</para>
</para>
<para>Como vê, a única adição para dar ao botão mais interacção é usar um método <methodname>connect() </methodname>: o <methodname>connect(&ola, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>; é tudo o que você tem para adicionar. Qual é o significado? A declaração da classe do QObject fala sobre o método <methodname>connect()</methodname>: </para>
<para>Como vê, a única adição para dar ao botão mais interacção é usar um método <methodname>connect() </methodname>: o <methodname>connect(&ola, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>; é tudo o que você tem para adicionar. Qual é o significado? A declaração da classe do TQObject fala sobre o método <methodname>connect()</methodname>: </para>
<para>Isto significa que você terá de indicar um ponteiro para uma instância de um <classname>QObject</classname> que é o emissor do 'signal', o que significa que ele poderá emitir este 'signal' como primeiro parâmetro; depois, terá de indicar o 'signal' a que se deseja ligar. Os últimos dois parâmetros são o objecto receptor que contém um 'slot' seguido da função-membro que é, de facto, o 'slot' que será executado devido à emissão do 'signal'. </para>
<para>Isto significa que você terá de indicar um ponteiro para uma instância de um <classname>TQObject</classname> que é o emissor do 'signal', o que significa que ele poderá emitir este 'signal' como primeiro parâmetro; depois, terá de indicar o 'signal' a que se deseja ligar. Os últimos dois parâmetros são o objecto receptor que contém um 'slot' seguido da função-membro que é, de facto, o 'slot' que será executado devido à emissão do 'signal'. </para>
<para>Usando os 'signals' e 'slots', os objectos do seu programa podem interagir uns com os outros facilmente sem terem de explicitamente depender do tipo do objecto receptor. Você irá aprender mais sobre a utilização deste mecanismo para uma utilização produtiva posteriormente neste manual. Se quiser saber mais informações sobre o mecanismo de 'signals'/'slots' poderá ir ao <ulink url="developer.kde.org/documentation/library/libraryref.html">Guia de Referência da Biblioteca do KDE</ulink> e à <ulink url="doc.trolltech.com">referência 'online' do Qt</ulink>. </para>
<para>Usando os 'signals' e 'slots', os objectos do seu programa podem interagir uns com os outros facilmente sem terem de explicitamente depender do tipo do objecto receptor. Você irá aprender mais sobre a utilização deste mecanismo para uma utilização produtiva posteriormente neste manual. Se quiser saber mais informações sobre o mecanismo de 'signals'/'slots' poderá ir ao <ulink url="developer.kde.org/documentation/library/libraryref.html">Guia de Referência da Biblioteca do KDE</ulink> e à <ulink url="doc.trolltech.com">referência 'online' do Qt</ulink>. </para>
</sect3>
</sect3>
</sect2>
</sect2>
@ -313,7 +313,7 @@ return a.exec();
</para>
</para>
<para>Você irá constatar que, primeiro, mudámos da <classname>QApplication</classname> para a <classname>TDEApplication </classname>. Para além disso, tivemos de mudar o método <methodname>setMainWidget()</methodname> para <methodname>setTopWidget</methodname>, o qual a classe <classname>TDEApplication</classname> usa para indicar qual o item principal. É tudo! A sua primeira aplicação do KDE está pronta - você só terá de indicar ao compilador a localização dos ficheiros de inclusão e ao editor de ligações para compilar com a biblioteca 'tdecore', através da opção'-ltdecore'. </para>
<para>Você irá constatar que, primeiro, mudámos da <classname>QApplication</classname> para a <classname>TDEApplication </classname>. Para além disso, tivemos de mudar o método <methodname>setMainWidget()</methodname> para <methodname>setTopWidget</methodname>, o qual a classe <classname>TDEApplication</classname> usa para indicar qual o item principal. É tudo! A sua primeira aplicação do KDE está pronta - você só terá de indicar ao compilador a localização dos ficheiros de inclusão e ao editor de ligações para compilar com a biblioteca 'tdecore', através da opção'-ltdecore'. </para>
<para>Dado que já sabe o que, pelo menos, a função <function>main()</function> necessita geralmente e como é que uma aplicação fica visível e permite a interacção com o utilizador e com os objectos, iremos agora para o próximo capítulo, onde a nossa primeira aplicação será criada com o &tdevelop;. Aí, você também poderá testar tudo o que foi mencionado antes e ver os efeitos. </para>
<para>Dado que já sabe o que, pelo menos, a função <function>main()</function> necessita geralmente e como é que uma aplicação fica visível e permite a interacção com o utilizador e com os objectos, iremos agora para o próximo capítulo, onde a nossa primeira aplicação será criada com o &tdevelop;. Aí, você também poderá testar tudo o que foi mencionado antes e ver os efeitos. </para>
<para>O que você deverá ter olhado adicionalmente até agora é a documentação de referência do Qt, especialmente a as classes <classname>QApplication</classname>, <classname>QWidget</classname> e <classname>QObject </classname>, assim como a documentação da biblioteca 'tdecore' para a classe <classname>TDEApplication</classname>. O <ulink url="developer.kde.org/documentation/library/libraryref.html">Manual de Referência da Biblioteca do KDE</ulink> também cobre uma descrição completa da invocação dos construtores da <classname>QApplication</classname> e da <classname>TDEApplication</classname>, incluindo o processamento dos argumentos da linha de comandos. </para>
<para>O que você deverá ter olhado adicionalmente até agora é a documentação de referência do Qt, especialmente a as classes <classname>QApplication</classname>, <classname>TQWidget</classname> e <classname>TQObject </classname>, assim como a documentação da biblioteca 'tdecore' para a classe <classname>TDEApplication</classname>. O <ulink url="developer.kde.org/documentation/library/libraryref.html">Manual de Referência da Biblioteca do KDE</ulink> também cobre uma descrição completa da invocação dos construtores da <classname>QApplication</classname> e da <classname>TDEApplication</classname>, incluindo o processamento dos argumentos da linha de comandos. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // permitir à vista mudar a barra de estado e o título
18 // permitir à vista mudar a barra de estado e o título
<para>Escusado será dizer que a estabilidade é um grande objectivo de desenho. Ninguém poderá evitar os erros, mas poderemos obter um mínimo se tivermos objectivos de desenho inteligentes e um uso abrangente de desenho orientado por objectos. O C++ torna a programação uma alegria se você souber como explorar as suas capacidades - a herança, o isolamento de informação e a reutilização de código já existente. </para>
<para>Escusado será dizer que a estabilidade é um grande objectivo de desenho. Ninguém poderá evitar os erros, mas poderemos obter um mínimo se tivermos objectivos de desenho inteligentes e um uso abrangente de desenho orientado por objectos. O C++ torna a programação uma alegria se você souber como explorar as suas capacidades - a herança, o isolamento de informação e a reutilização de código já existente. </para>
<para>Ao criar um projecto do KDE ou do Qt, você terá de ter sempre uma vista que herde de QWidget, quer por herança directa, ou então porque o item da biblioteca que deseja usar herda do QWidget. Como tal, o Assistente de Aplicações já construiu uma vista que é uma instância de uma classe suaAplicacaoView, a qual já herda de QWidget. </para>
<para>Ao criar um projecto do KDE ou do Qt, você terá de ter sempre uma vista que herde de TQWidget, quer por herança directa, ou então porque o item da biblioteca que deseja usar herda do TQWidget. Como tal, o Assistente de Aplicações já construiu uma vista que é uma instância de uma classe suaAplicacaoView, a qual já herda de TQWidget. </para>
<para>Este capítulo descreve, deste modo, como usar os itens das bibliotecas para criar vistas das aplicações do KDE e do QT que sejam geradas com o &tdevelop;, e iremos depois olhar para os tipos de vistas que já são oferecidas. </para>
<para>Este capítulo descreve, deste modo, como usar os itens das bibliotecas para criar vistas das aplicações do KDE e do QT que sejam geradas com o &tdevelop;, e iremos depois olhar para os tipos de vistas que já são oferecidas. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>Olhando para a primeira página da documentação 'online' do Qt, você irá ver uma referência a "Widget Screenshots" (Imagens dos Elementos Gráficos), onde você poderá ver como é que o itens que o Qt contém irão ficar. Eles estão prontos a usar e podem ser combinados em conjunto para forma itens mais complexos, de modo a criar vistas de aplicações ou janelas. A seguir, iremos discutir alguns destes itens que são muito úteis para criar vistas de aplicações; tenha contudo em mente que as bibliotecas do KDE algumas vezes contêm outros itens para o mesmo fim; estes serão revistos na próxima secção. </para>
<para>Olhando para a primeira página da documentação 'online' do Qt, você irá ver uma referência a "Widget Screenshots" (Imagens dos Elementos Gráficos), onde você poderá ver como é que o itens que o Qt contém irão ficar. Eles estão prontos a usar e podem ser combinados em conjunto para forma itens mais complexos, de modo a criar vistas de aplicações ou janelas. A seguir, iremos discutir alguns destes itens que são muito úteis para criar vistas de aplicações; tenha contudo em mente que as bibliotecas do KDE algumas vezes contêm outros itens para o mesmo fim; estes serão revistos na próxima secção. </para>
<para>Aqui está um conjunto de sugestões sobre o fim para que você irá usar um determinado componente do Qt: <orderedlist>
<para>Aqui está um conjunto de sugestões sobre o fim para que você irá usar um determinado componente do Qt: <orderedlist>
<listitem><para>Se a área da sua janela não for grande o suficiente para mostrar todos os seus dados, o utilizador irá precisar de se deslocar pelo documento através de barras à esquerda e em baixo na janela. Para isso, o Qt oferece a classe <classname>QScrollView</classname>, que oferece uma área-filha que poderá ser posicionável. Como foi dito, você poderá herdar o seu próprio item de <classname>QScrollView</classname> ou usar uma instância para gerir o item da vista do seu documento. </para></listitem>
<listitem><para>Se a área da sua janela não for grande o suficiente para mostrar todos os seus dados, o utilizador irá precisar de se deslocar pelo documento através de barras à esquerda e em baixo na janela. Para isso, o Qt oferece a classe <classname>QScrollView</classname>, que oferece uma área-filha que poderá ser posicionável. Como foi dito, você poderá herdar o seu próprio item de <classname>QScrollView</classname> ou usar uma instância para gerir o item da vista do seu documento. </para></listitem>
<listitem><para>Para criar você próprio uma ScrollView, herde o item da vista da classe <classname>QWidget</classname> e adicione <classname>QScrollBars </classname> verticais e horizontais. (Isto é feito pelo item TDEHTMLView do KDE). </para></listitem>
<listitem><para>Para criar você próprio uma ScrollView, herde o item da vista da classe <classname>TQWidget</classname> e adicione <classname>QScrollBars </classname> verticais e horizontais. (Isto é feito pelo item TDEHTMLView do KDE). </para></listitem>
<listitem><para>Para processar texto, use a <classname>QTextEdit</classname>. Esta classe fornece um elemento gráfico de edição de texto completo que já é capaz de cortar, copiar e colar texto e é gerido por uma vista posicionável. </para></listitem>
<listitem><para>Para processar texto, use a <classname>QTextEdit</classname>. Esta classe fornece um elemento gráfico de edição de texto completo que já é capaz de cortar, copiar e colar texto e é gerido por uma vista posicionável. </para></listitem>
<listitem><para>Use a <classname>QTable</classname> para mostrar dados organizados numa tabela. Dado que a <classname>QTable</classname> usa também barras de posicionamento, é uma boa solução para aplicações de cálculos de tabelas. </para></listitem>
<listitem><para>Use a <classname>QTable</classname> para mostrar dados organizados numa tabela. Dado que a <classname>QTable</classname> usa também barras de posicionamento, é uma boa solução para aplicações de cálculos de tabelas. </para></listitem>
<listitem><para>Para mostrar dois itens diferentes ou duas janelas ao mesmo tempo, use o <classname>QSplitter </classname>. Isto permite pôr lado-a-lado as vistas com divisões horizontais ou verticais. O KMail é um bom exemplo do que isto iria parecer - a área principal é separada na vertical por uma divisória e a área do lado direito é, por sua vez, dividida de novo na horizontal. </para></listitem>
<listitem><para>Para mostrar dois itens diferentes ou duas janelas ao mesmo tempo, use o <classname>QSplitter </classname>. Isto permite pôr lado-a-lado as vistas com divisões horizontais ou verticais. O KMail é um bom exemplo do que isto iria parecer - a área principal é separada na vertical por uma divisória e a área do lado direito é, por sua vez, dividida de novo na horizontal. </para></listitem>
@ -653,7 +653,7 @@ return a.exec();
<title>Configuração de Aceleradores de Teclado</title>
<title>Configuração de Aceleradores de Teclado</title>
<para>Uma coisa muito profissional que você deverá sempre adicionar à sua aplicação são os aceleradores de teclado. Estes são principalmente usados pelos utilizadores experientes que gostam de trabalhar depressa com as suas aplicações e que estão dispostos a aprender atalhos. Para isso, as bibliotecas do KDE fornecem a classe <classname> TDEAction</classname>, que fornece as teclas de atalho do teclado e o acesso aos aceleradores-padrão de teclado, configurados a nível global. </para>
<para>Uma coisa muito profissional que você deverá sempre adicionar à sua aplicação são os aceleradores de teclado. Estes são principalmente usados pelos utilizadores experientes que gostam de trabalhar depressa com as suas aplicações e que estão dispostos a aprender atalhos. Para isso, as bibliotecas do KDE fornecem a classe <classname> TDEAction</classname>, que fornece as teclas de atalho do teclado e o acesso aos aceleradores-padrão de teclado, configurados a nível global. </para>
<para>Por omissão, as aplicações gráficas geradas pelo &tdevelop; só usam os aceleradores de teclado normais, como o F1 para aceder à ajuda 'online', o Ctrl+N para Novo Ficheiro, etc. </para>
<para>Por omissão, as aplicações gráficas geradas pelo &tdevelop; só usam os aceleradores de teclado normais, como o F1 para aceder à ajuda 'online', o Ctrl+N para Novo Ficheiro, etc. </para>
<para>Se a sua aplicação contiver um conjunto de aceleradores, você deverá torná-los configuráveis num menu de opções; tanto poderão estar em conjunto com outras configurações da aplicação numa QWidget como usados isoladamente. A biblioteca do KDE já fornece uma classe <classname>KKeyChooser</classname> para ser usada em páginas de uma janela, enquanto que a <classname>KKeyDialog</classname> fornece uma janela de configuração de teclas pronta a usar. </para>
<para>Se a sua aplicação contiver um conjunto de aceleradores, você deverá torná-los configuráveis num menu de opções; tanto poderão estar em conjunto com outras configurações da aplicação numa TQWidget como usados isoladamente. A biblioteca do KDE já fornece uma classe <classname>KKeyChooser</classname> para ser usada em páginas de uma janela, enquanto que a <classname>KKeyDialog</classname> fornece uma janela de configuração de teclas pronta a usar. </para>
</sect1>
</sect1>
</chapter>
</chapter>
@ -696,7 +696,7 @@ return a.exec();
<sect1 id="c8s4">
<sect1 id="c8s4">
<title>O Botão <guibutton>O que é Isto...?</guibutton></title>
<title>O Botão <guibutton>O que é Isto...?</guibutton></title>
<para>O botão <guibutton>O Que É Isto...?</guibutton> fornece janelas de ajuda com a intenção de que o utilizador quer obter ajuda sobre um determinado elemento na área de trabalho ou sobre um item da barra de ferramentas. É colocado na barra de ferramentas e é activado logo que o utilizador carregue no botão. O cursor muda para uma seta com um ponto de interrogação semelhante ao que o botão tem. O utilizador então poderá carregar num item visível para obter uma janela de ajuda. Como exercício, você poderá tentar este comportamento com o botão <guibutton>O que é isto...?</guibutton> no &tdevelop;. </para>
<para>O botão <guibutton>O Que É Isto...?</guibutton> fornece janelas de ajuda com a intenção de que o utilizador quer obter ajuda sobre um determinado elemento na área de trabalho ou sobre um item da barra de ferramentas. É colocado na barra de ferramentas e é activado logo que o utilizador carregue no botão. O cursor muda para uma seta com um ponto de interrogação semelhante ao que o botão tem. O utilizador então poderá carregar num item visível para obter uma janela de ajuda. Como exercício, você poderá tentar este comportamento com o botão <guibutton>O que é isto...?</guibutton> no &tdevelop;. </para>
<para>Para adicionar a ajuda 'O Que É Isto...?' a um dos seus itens gráficos, use o método estático <methodname>QWhatsThis::add(QWidget *item, const QString &texto)</methodname> </para>
<para>Para adicionar a ajuda 'O Que É Isto...?' a um dos seus itens gráficos, use o método estático <methodname>QWhatsThis::add(TQWidget *item, const TQString &texto)</methodname> </para>
<para>O modelo de imagens de baixo nível do Qt é baseado nas capacidades oferecidas pelo X11 e por outros sistemas de janelas para os quais o Qt foi implementado. Mas também as extende, implementando funcionalidades adicionais como as transformações arbitrárias por afinidade para texto e imagens. </para>
<para>O modelo de imagens de baixo nível do Qt é baseado nas capacidades oferecidas pelo X11 e por outros sistemas de janelas para os quais o Qt foi implementado. Mas também as extende, implementando funcionalidades adicionais como as transformações arbitrárias por afinidade para texto e imagens. </para>
<para>A classe gráfica central para o desenho 2D com o Qt é a <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Ela poderá desenhar num <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Existem três dispositivos de pintura implementados: um é o <ulink url="kdeapi:qt/QWidget">QWidget</ulink> que representa um elemento gráfico no ecrã. A outra é o <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> que representa uma impressora e que produz o resultado em &PostScript;. A terceira é a <ulink url="kdeapi:qt/QPicture">QPicture</ulink> que guarda os comandos de desenho e que poderá gravá-los em disco e reproduzi-los depois. Uma formato possível para os comandos de desenho é a norma SVG da W3C. </para>
<para>A classe gráfica central para o desenho 2D com o Qt é a <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Ela poderá desenhar num <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Existem três dispositivos de pintura implementados: um é o <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink> que representa um elemento gráfico no ecrã. A outra é o <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink> que representa uma impressora e que produz o resultado em &PostScript;. A terceira é a <ulink url="kdeapi:qt/QPicture">QPicture</ulink> que guarda os comandos de desenho e que poderá gravá-los em disco e reproduzi-los depois. Uma formato possível para os comandos de desenho é a norma SVG da W3C. </para>
<para>Como tal, é possível reaproveitar o código de desenho que você usa para mostrar num item gráfico ou para imprimir, usando as mesmas funcionalidades suportadas. Claro que, na prática, o código é usado num contexto ligeiramente diferente. Desenhar num item gráfico é quase exclusivamente feito no método <methodname>paintEvent()</methodname> da classe de um elemento gráfico. </para>
<para>Como tal, é possível reaproveitar o código de desenho que você usa para mostrar num item gráfico ou para imprimir, usando as mesmas funcionalidades suportadas. Claro que, na prática, o código é usado num contexto ligeiramente diferente. Desenhar num item gráfico é quase exclusivamente feito no método <methodname>paintEvent()</methodname> da classe de um elemento gráfico. </para>
<para>QBrush::QBrush(BrushStyle) - Isto cria um pincel preto com um dos padrões predefinidos que são mostrados em baixo.</para>
<para>QBrush::QBrush(BrushStyle) - Isto cria um pincel preto com um dos padrões predefinidos que são mostrados em baixo.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, BrushStyle) - Isto cria um pincel colorido com um dos seguinte padrões mostrados em baixo.</para>
<para>QBrush::QBrush(const TQColor &, BrushStyle) - Isto cria um pincel colorido com um dos seguinte padrões mostrados em baixo.</para>
</listitem>
</listitem>
<listitem>
<listitem>
<para>QBrush::QBrush(const QColor &, const QPixmap) - Isto cria um pincel colorido com o padrão personalizado que você passar como segundo parâmetro.</para>
<para>QBrush::QBrush(const TQColor &, const QPixmap) - Isto cria um pincel colorido com o padrão personalizado que você passar como segundo parâmetro.</para>
<para>As cores têm um papel activo, quer a traçar as curvas, quer a preencher as formas geométricas. No Qt, as cores são representadas pela classe <ulink url="kdeapi:qt/QColor">QColor</ulink>. O Qt não suporta as funcionalidades gráficas avançadas, como os perfis de cores ICC e a correcção de cores. As cores são normalmente definidas, indicando os valores das componentes vermelha, verde e azul, dado que o modelo RGB é a forma como os pixels são compostos num monitor. </para>
<para>As cores têm um papel activo, quer a traçar as curvas, quer a preencher as formas geométricas. No Qt, as cores são representadas pela classe <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. O Qt não suporta as funcionalidades gráficas avançadas, como os perfis de cores ICC e a correcção de cores. As cores são normalmente definidas, indicando os valores das componentes vermelha, verde e azul, dado que o modelo RGB é a forma como os pixels são compostos num monitor. </para>
<para>É também possível usar o matiz, a saturação e o valor. Esta representação HSV é a que você usa na janela de cores do Gtk, p.ex. no GIMP. Aí, o matiz corresponde ao ângulo na roda de cores, enquanto a saturação corresponde à distância ao centro do círculo. O valor pode ser escolhido com uma barra em separado. </para>
<para>É também possível usar o matiz, a saturação e o valor. Esta representação HSV é a que você usa na janela de cores do Gtk, p.ex. no GIMP. Aí, o matiz corresponde ao ângulo na roda de cores, enquanto a saturação corresponde à distância ao centro do círculo. O valor pode ser escolhido com uma barra em separado. </para>
<para>A <ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corresponde directamente aos objectos das imagens no X11. As imagens são objectos do lado do servidor e podem - numa placa gráfica moderna - até mesmo ser gravadas directamente na memória da placa. Isto torna <emphasis>bastante</emphasis> eficiente a transferência de imagens para o ecrã. As imagens também funcionam como um equivalente, fora do ecrã , dos elementos gráficos - a classe QPixmap é uma subclasse da QPaintDevice, por isso você poderá desenhar nela com um QPainter. As operações elementares de desenho são normalmente aceleradas pelos dispositivos gráficos modernos. Daí, um padrão de uso normal é usar as imagens para fazer duplo-'buffering'. Isto significa que, em vez de desenhar directamente num elemento gráfico, você desenha num objecto temporário de imagem e usa a função <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> para transferir a imagem para o elemento gráfico. Para os desenhos complexos, isto ajuda a evitar intermitências. </para>
<para>A <ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> corresponde directamente aos objectos das imagens no X11. As imagens são objectos do lado do servidor e podem - numa placa gráfica moderna - até mesmo ser gravadas directamente na memória da placa. Isto torna <emphasis>bastante</emphasis> eficiente a transferência de imagens para o ecrã. As imagens também funcionam como um equivalente, fora do ecrã , dos elementos gráficos - a classe QPixmap é uma subclasse da QPaintDevice, por isso você poderá desenhar nela com um QPainter. As operações elementares de desenho são normalmente aceleradas pelos dispositivos gráficos modernos. Daí, um padrão de uso normal é usar as imagens para fazer duplo-'buffering'. Isto significa que, em vez de desenhar directamente num elemento gráfico, você desenha num objecto temporário de imagem e usa a função <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> para transferir a imagem para o elemento gráfico. Para os desenhos complexos, isto ajuda a evitar intermitências. </para>
<para>Em contraste, os objectos <ulink url="kdeapi:qt/QImage">QImage</ulink> residem do lado do cliente. A sua ênfase é na fornecer um acesso directo aos pixels da imagem. Isso torna-os úteis para manipular imagens e para coisas como a leitura e gravação em disco (o método load() da QPixmap recebe uma QImage como passo intermédio). Por outro lado, desenhar uma imagem num elemento gráfico é uma operação relativamente dispendiosa, dado que implica uma transferência para o servidor X, o que ainda poderá levar algum tempo, especialmente para imagens grandes e para servidores remotos. Dependendo da profundidade de cor, a conversão de uma QImage para uma QPixmap pode necessitar de ajuste de cores. </para>
<para>Em contraste, os objectos <ulink url="kdeapi:qt/TQImage">TQImage</ulink> residem do lado do cliente. A sua ênfase é na fornecer um acesso directo aos pixels da imagem. Isso torna-os úteis para manipular imagens e para coisas como a leitura e gravação em disco (o método load() da QPixmap recebe uma TQImage como passo intermédio). Por outro lado, desenhar uma imagem num elemento gráfico é uma operação relativamente dispendiosa, dado que implica uma transferência para o servidor X, o que ainda poderá levar algum tempo, especialmente para imagens grandes e para servidores remotos. Dependendo da profundidade de cor, a conversão de uma TQImage para uma QPixmap pode necessitar de ajuste de cores. </para>
<para>O texto poderá ser desenhado com uma das variantes do método QPainter::drawText(). Estas desenham uma QString quer num dado ponto, quer num dado rectângulo, usando o tipo de letra definido pelo QPainter::setFont(). Existe também um parâmetro que recebe uma combinação do tipo OU de algumas opções dos tipos enumerados <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> e <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>O texto poderá ser desenhado com uma das variantes do método QPainter::drawText(). Estas desenham uma TQString quer num dado ponto, quer num dado rectângulo, usando o tipo de letra definido pelo QPainter::setFont(). Existe também um parâmetro que recebe uma combinação do tipo OU de algumas opções dos tipos enumerados <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> e <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink> </para>
<para>A partir da versão 3.0, o Qt toma conta da disposição completa do texto, mesmo para as línguas escritas da direita para a esquerda. </para>
<para>A partir da versão 3.0, o Qt toma conta da disposição completa do texto, mesmo para as línguas escritas da direita para a esquerda. </para>
<para>Para além dos itens normais, este exemplo demonstra como é que você declara que um serviço tem determinadas propriedades. Cada definição de propriedades corresponde a um grupo <literal>[PropertyDef::name]</literal> no ficheiro de configuração. Neste grupo, o item <literal>Type</literal> define o tipo da propriedades. Os tipos possíveis são todos os que conseguem ser registados num <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Para além dos itens normais, este exemplo demonstra como é que você declara que um serviço tem determinadas propriedades. Cada definição de propriedades corresponde a um grupo <literal>[PropertyDef::name]</literal> no ficheiro de configuração. Neste grupo, o item <literal>Type</literal> define o tipo da propriedades. Os tipos possíveis são todos os que conseguem ser registados num <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1197,11 +1197,11 @@ X-KDevelop-Scope=Project
<para>Com o objecto <classname>KService</classname> acessível, você poderá simplesmente carregar a biblioteca e obter uma referência para o objecto da sua 'factory': </para>
<para>Com o objecto <classname>KService</classname> acessível, você poderá simplesmente carregar a biblioteca e obter uma referência para o objecto da sua 'factory': </para>
if (!cliente->isApplicationRegistered("tdeio_uiserver")) {
if (!cliente->isApplicationRegistered("tdeio_uiserver")) {
QString erro;
TQString erro;
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &erro))
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &erro))
cout << "O início do kioserver falhou com a mensagem " << erro << endl;
cout << "O início do kioserver falhou com a mensagem " << erro << endl;
}
}
@ -1276,7 +1276,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>No exemplo aqui dado, o serviço foi iniciado "por nome", i.e., o primeiro argumento do <function>TDEApplication::startServiceByName()</function> é o nome que aparece na linha <literal>Name</literal> do ficheiro 'desktop'. Uma alternativa é usar o <function>TDEApplication::startServiceByDesktopName()</function>, que recebe o nome do ficheiro 'desktop' como argumento, i.e., neste caso, seria igual a <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>No exemplo aqui dado, o serviço foi iniciado "por nome", i.e., o primeiro argumento do <function>TDEApplication::startServiceByName()</function> é o nome que aparece na linha <literal>Name</literal> do ficheiro 'desktop'. Uma alternativa é usar o <function>TDEApplication::startServiceByDesktopName()</function>, que recebe o nome do ficheiro 'desktop' como argumento, i.e., neste caso, seria igual a <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Todas estas chamadas recebem uma lista de URLs como segundo argumento, o qual é dado ao serviço na linha de comandos. O terceiro argumento é um ponteiro para uma <classname>QString</classname>. Se o início do serviço falhar, este argumento fica igual à mensagem de erro traduzida. </para>
<para>Todas estas chamadas recebem uma lista de URLs como segundo argumento, o qual é dado ao serviço na linha de comandos. O terceiro argumento é um ponteiro para uma <classname>TQString</classname>. Se o início do serviço falhar, este argumento fica igual à mensagem de erro traduzida. </para>
</simplesect>
</simplesect>
@ -1386,7 +1386,7 @@ else
<para>Obviamente, até mesmo o KMimeMagic só é capaz de determinar o tipo do ficheiro para o conteúdo de um ficheiro local. Para os ficheiros remotos, existe uma outra possibilidade: </para>
<para>Obviamente, até mesmo o KMimeMagic só é capaz de determinar o tipo do ficheiro para o conteúdo de um ficheiro local. Para os ficheiros remotos, existe uma outra possibilidade: </para>
<para>Isto assume que você está dentro de um ficheiro do &kommander; e que tem acesso ao especial @pid, o qual contém o ID do processo. De facto, é mais simples substituir o <quote>kmdr-executor-@pid</quote> por @dcopid. Contudo, você poderá usar esta sintaxe (obviamente sem os especiais) a partir da linha de comandos ou com algum programa externo para alterar a janela do &kommander;. </para>
<para>Isto assume que você está dentro de um ficheiro do &kommander; e que tem acesso ao especial @pid, o qual contém o ID do processo. De facto, é mais simples substituir o <quote>kmdr-executor-@pid</quote> por @dcopid. Contudo, você poderá usar esta sintaxe (obviamente sem os especiais) a partir da linha de comandos ou com algum programa externo para alterar a janela do &kommander;. </para>
<para>Dado que o &kommander; não tem um processador completo na sua fase 'Alpha', se você quiser usar o &DCOP; interno, que é muito mais rápido, a partir de outra janela da aplicação (o &DCOP; da consola é bastante lento), será mais complicado porque você precisa de dar bastantes informações, incluindo um protótipo da chamada. A chamada acima ficaria igual a: </para>
<para>Dado que o &kommander; não tem um processador completo na sua fase 'Alpha', se você quiser usar o &DCOP; interno, que é muito mais rápido, a partir de outra janela da aplicação (o &DCOP; da consola é bastante lento), será mais complicado porque você precisa de dar bastantes informações, incluindo um protótipo da chamada. A chamada acima ficaria igual a: </para>
<para>Na altura em que isto foi escrito, você deverá saber que o encadeamento de chamadas de &DCOP; dentro de estruturas da linguagem de programação (como o <application>bash</application>) significa que você precisa de usar chamadas dos métodos a partir da consola. <emphasis>Se usar o &DCOP; interno, todos os especiais do &kommander; serão executados primeiro e depois o programa será então executado.</emphasis> </para>
<para>Na altura em que isto foi escrito, você deverá saber que o encadeamento de chamadas de &DCOP; dentro de estruturas da linguagem de programação (como o <application>bash</application>) significa que você precisa de usar chamadas dos métodos a partir da consola. <emphasis>Se usar o &DCOP; interno, todos os especiais do &kommander; serão executados primeiro e depois o programa será então executado.</emphasis> </para>
<para>Existe uma nova forma simplificada de usar o &DCOP; dentro do &kommander;, através de uma sintaxe de objectos. Digamos que você deseje alterar o texto num elemento chamado @CampoTexto1. Seria algo semelhante ao seguinte. </para>
<para>Existe uma nova forma simplificada de usar o &DCOP; dentro do &kommander;, através de uma sintaxe de objectos. Digamos que você deseje alterar o texto num elemento chamado @CampoTexto1. Seria algo semelhante ao seguinte. </para>
<para>Devolve o valor da variável global indicada. Quando um programa é corrido dentro de uma janela do &kommander;, todas as variáveis (não-globais) definidas neste programa deixarão de existir depois de o programa terminar e, como tal, não estarão disponíveis para outros processos de programas ou numa nova instância do processo que invoca. O <quote>âmbito</quote> global significa que a variável irá existir para qualquer processo da janela até que esta seja fechada. Você poderá alterar estas variáveis em qualquer altura com uma chamada nova ao <function>@setGlobal</function>. </para>
<para>Devolve o valor da variável global indicada. Quando um programa é corrido dentro de uma janela do &kommander;, todas as variáveis (não-globais) definidas neste programa deixarão de existir depois de o programa terminar e, como tal, não estarão disponíveis para outros processos de programas ou numa nova instância do processo que invoca. O <quote>âmbito</quote> global significa que a variável irá existir para qualquer processo da janela até que esta seja fechada. Você poderá alterar estas variáveis em qualquer altura com uma chamada nova ao <function>@setGlobal</function>. </para>
<para>Cria uma variável que é global para o processo da janela e atribui o valor a ela. Este valor poderá ser obtido com a chamada global(QString nomeVariavel) ou alterada de novo. </para>
<para>Cria uma variável que é global para o processo da janela e atribui o valor a ela. Este valor poderá ser obtido com a chamada global(TQString nomeVariavel) ou alterada de novo. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString texto)</term>
<term>changeWidgetText(TQString texto)</term>
<listitem>
<listitem>
<para>Este deverá ser mudado para 'setWidgetText' e este nome poderá vir a ficar obsoleto. Isto remove o texto apresentado no elemento gráfico e substitui-o pelo texto indicado. </para>
<para>Este deverá ser mudado para 'setWidgetText' e este nome poderá vir a ficar obsoleto. Isto remove o texto apresentado no elemento gráfico e substitui-o pelo texto indicado. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString texto)</term>
<term>setAssociatedText(TQString texto)</term>
<listitem>
<listitem>
<para>Isto configura o texto por omissão do Texto do &kommander;. Isto é tipicamente igual a <quote>@widgetText</quote> para mostrar o que é introduzido no elemento gráfico. É pouco provável que tenha muita necessidade disto, mas se o fizer, será aqui. Aplica-se a todos os elementos que possam conter dados. </para>
<para>Isto configura o texto por omissão do Texto do &kommander;. Isto é tipicamente igual a <quote>@widgetText</quote> para mostrar o que é introduzido no elemento gráfico. É pouco provável que tenha muita necessidade disto, mas se o fizer, será aqui. Aplica-se a todos os elementos que possam conter dados. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>O &DCOP; para os Elementos ListBox e ComboBox</title>
<title>O &DCOP; para os Elementos ListBox e ComboBox</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString item, int indice)</term>
<term>addListItem(TQString item, int indice)</term>
<listitem>
<listitem>
<para>Adiciona um item a um elemento ListBox no índice indicado. O índice da lista começa em zero. Para adicionar ao fim da lista, use -1. </para>
<para>Adiciona um item a um elemento ListBox no índice indicado. O índice da lista começa em zero. Para adicionar ao fim da lista, use -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString item)</term>
<term>addUniqueItem(TQString item)</term>
<listitem>
<listitem>
<para>O 'addUniqueItem' irá adicionar um item ao fim da lista, somente se for único. </para>
<para>O 'addUniqueItem' irá adicionar um item ao fim da lista, somente se for único. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>O &DCOP; para os Elementos CheckBox e RadioButton</title>
<title>O &DCOP; para os Elementos CheckBox e RadioButton</title>
<listitem><para>O 'adiante negativo' previne que uma possível combinação seja de conhecimento, se a seguinte parte da string buscada não combina com seu <emphasis>PADRÃO</emphasis>.</para>
<listitem><para>O 'adiante negativo' previne que uma possível combinação seja de conhecimento, se a seguinte parte da string buscada não combina com seu <emphasis>PADRÃO</emphasis>.</para>
<para>A expressão <userinput>const \w+\b(?!\s*&)</userinput> combinará com <quote>const char</quote> na string <quote>const char* foo </quote> enquanto que não combinará <quote>const QString</quote> em <quote>const QString& bar</quote>, pois o <quote>& </quote> combina com o padrão de afirmação negativo.</para>
<para>A expressão <userinput>const \w+\b(?!\s*&)</userinput> combinará com <quote>const char</quote> na string <quote>const char* foo </quote> enquanto que não combinará <quote>const TQString</quote> em <quote>const TQString& bar</quote>, pois o <quote>& </quote> combina com o padrão de afirmação negativo.</para>
@ -501,7 +501,7 @@ Welcome Text = Carregando o KDE
<para>Antes de seu aplicativo iniciar um trabalho intensivo de computação, ou antes de ele iniciar o carregamento de plugins, &etc;, invoque o &ksplash; como se segue:</para>
<para>Antes de seu aplicativo iniciar um trabalho intensivo de computação, ou antes de ele iniciar o carregamento de plugins, &etc;, invoque o &ksplash; como se segue:</para>
if (!(c->send(NomeKSplash, "KSplashIface", "programStarted(QString,QString,QString)", dados))
if (!(c->send(NomeKSplash, "KSplashIface", "programStarted(TQString,TQString,TQString)", dados))
{
{
// Algum processamento de erros aqui.
// Algum processamento de erros aqui.
}
}
@ -596,7 +596,7 @@ X-KSplash-ObjectName=Theme2k
<listitem><para>Classes de plugin devem fornecer uma função <literal>static</literal> chamada <function>names</function> que retorna uma lista dos nomes pela qual ela pode ser invocada.</para></listitem>
<listitem><para>Classes de plugin devem fornecer uma função <literal>static</literal> chamada <function>names</function> que retorna uma lista dos nomes pela qual ela pode ser invocada.</para></listitem>
<listitem><para>Se o plugin pode ser configurado no módulo do centro de controle, ele deve fornecer uma classe baseada em <literal>ThemeEngineConfig</literal> para a configuração.</para></listitem>
<listitem><para>Se o plugin pode ser configurado no módulo do centro de controle, ele deve fornecer uma classe baseada em <literal>ThemeEngineConfig</literal> para a configuração.</para></listitem>
<listitem><para>Classes de plugin devem sobrescrever pelo menos as funções virtuais de <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> para torná-las úteis.</para></listitem>
<listitem><para>Classes de plugin devem sobrescrever pelo menos as funções virtuais de <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> e <function>slotUpdateSteps</function> para torná-las úteis.</para></listitem>
<listitem><para>O construtor deve tomar a forma <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> de modo que ele possa ser usado com o <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>O construtor deve tomar a forma <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> de modo que ele possa ser usado com o <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>O último requisito pode ser mais complicado, mas, como veremos mais tarde, adicionando uma linha simples ao seus arquivos fonte, você pode normalmente ignorá-lo.</para>
<para>O último requisito pode ser mais complicado, mas, como veremos mais tarde, adicionando uma linha simples ao seus arquivos fonte, você pode normalmente ignorá-lo.</para>
</sect1>
</sect1>
@ -629,11 +629,11 @@ class Theme2k: public ThemeEngine
<para>Vamos analisar a lista acima. A classe <classname>Theme2k</classname> satisfaz a convenção de nomes, e é filha de <classname>ThemeEngine</classname>. Ela fornece um <methodname>Theme2k::names()</methodname>, e possui um construtor que recebe os seguintes parâmetros: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> e também fornece um método <methodname>Theme2k::slotSetText()</methodname> simples. Por enquanto, não se preocupe com a classe <classname>RotWidget</classname>. Ela é um pequeno widget que fornece algum colírio para os olhos do usuário. Nosso plugin é muito simples e não exibe nenhum ícone ou mostra uma barra de progresso. Se você gostaria de exibir ícones, sobrescreva a função <function>slotSetPixmap</function>. Funções semelhantes existem para configurar o intervalo da barra de progresso (<function>slotUpdateSteps</function>) e incrementar (<function>slotUpdateProgress</function>) o passo atual. </para>
<para>Vamos analisar a lista acima. A classe <classname>Theme2k</classname> satisfaz a convenção de nomes, e é filha de <classname>ThemeEngine</classname>. Ela fornece um <methodname>Theme2k::names()</methodname>, e possui um construtor que recebe os seguintes parâmetros: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> e também fornece um método <methodname>Theme2k::slotSetText()</methodname> simples. Por enquanto, não se preocupe com a classe <classname>RotWidget</classname>. Ela é um pequeno widget que fornece algum colírio para os olhos do usuário. Nosso plugin é muito simples e não exibe nenhum ícone ou mostra uma barra de progresso. Se você gostaria de exibir ícones, sobrescreva a função <function>slotSetPixmap</function>. Funções semelhantes existem para configurar o intervalo da barra de progresso (<function>slotUpdateSteps</function>) e incrementar (<function>slotUpdateProgress</function>) o passo atual. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementação do plugin</title>
<title>Implementação do plugin</title>
@ -682,7 +682,7 @@ private:
<para>O macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> é declarado em <filename>kgenericfactory.h</filename>. Vamos para o construtor! Uma vez que é um plugin muito simples, o construtor é consideravelmente simples.</para>
<para>O macro <constant>K_EXPORT_COMPONENT_FACTORY</constant> é declarado em <filename>kgenericfactory.h</filename>. Vamos para o construtor! Uma vez que é um plugin muito simples, o construtor é consideravelmente simples.</para>
<para>A Interface <abbrev>DCOP</abbrev> do &kstars; inclui as seguintes funções: <itemizedlist>
<para>A Interface <abbrev>DCOP</abbrev> do &kstars; inclui as seguintes funções: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: Aponta o foco da tela na direção especificada pelo argumento. O argumento pode ser o nome de qualquer objeto no céu, ou uma das seguintes palavras direcionais ou abreviaturas: zenith (ou z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: Aponta o foco da tela na direção especificada pelo argumento. O argumento pode ser o nome de qualquer objeto no céu, ou uma das seguintes palavras direcionais ou abreviaturas: zenith (ou z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Aponta o foco da tela nas coordenadas equatorias especificadas. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Aponta o foco da tela nas coordenadas equatorias especificadas. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Interrompe por t segundos antes de continuar com os comandos subsequentes do script. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Interrompe por t segundos antes de continuar com os comandos subsequentes do script. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Para a execução do script até que o usuário pressione a tecla especificada. Até o momento, você não pode especificar combinações com teclas especiais (como <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); simplesmente use teclas simples. Você pode digitar <quote>space</quote> para indicar a barra de espaço. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Para a execução do script até que o usuário pressione a tecla especificada. Até o momento, você não pode especificar combinações com teclas especiais (como <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); simplesmente use teclas simples. Você pode digitar <quote>space</quote> para indicar a barra de espaço. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Alterna o engajamento do modo de rastreamento. </para></listitem>
<listitem><para><function> setTracking( bool track )</function>: Alterna o engajamento do modo de rastreamento. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Ajusta uma opção de visão. Existem dúzias e dúzias de opções disponíveis, basicamente tudo que você pode musar na <guilabel>Janela Configurar o &kstars;</guilabel> pode ser mudado aqui também. O primeiro argumento é o nome da opção (os nomes são obtidos a partir do arquivo de configuração <filename>kstarsrc</filename>), e o segundo argumento é o valor desejado. A análise do argumento foi feita para ser robusta, logo se você acidentalmente enviar dados ruins, ele simplesmente falhará. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Ajusta uma opção de visão. Existem dúzias e dúzias de opções disponíveis, basicamente tudo que você pode musar na <guilabel>Janela Configurar o &kstars;</guilabel> pode ser mudado aqui também. O primeiro argumento é o nome da opção (os nomes são obtidos a partir do arquivo de configuração <filename>kstarsrc</filename>), e o segundo argumento é o valor desejado. A análise do argumento foi feita para ser robusta, logo se você acidentalmente enviar dados ruins, ele simplesmente falhará. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Muda a localização de observação para a cidade especificada. Se nenhuma cidade correspondente ao string do argumento for encontrada, então nada acontecerá. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Muda a localização de observação para a cidade especificada. Se nenhuma cidade correspondente ao string do argumento for encontrada, então nada acontecerá. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Para o relógio da simulação. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Para o relógio da simulação. </para></listitem>
<listitem><para>Funções de Dispositivo Genéricas: Funções para estabelecer/desligar dispositivos, etc.</para>
<listitem><para>Funções de Dispositivo Genéricas: Funções para estabelecer/desligar dispositivos, etc.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString dispoNome, bool usarLocal)</function> : Estabelece um serviço INDI seja local ou servidor.</para></listitem>
<listitem><para><function>startINDI (TQString dispoNome, bool usarLocal)</function> : Estabelece um serviço INDI seja local ou servidor.</para></listitem>
<listitem><para><function>shutdownINDI (QString dispoNome)</function> : Desliga o serviço INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString dispoNome)</function> : Desliga o serviço INDI.</para></listitem>
<listitem><para><function>switchINDI(QString dispoNome, bool tornarOn)</function> : Conecta ou Disconecta um dispositivo INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString dispoNome, bool tornarOn)</function> : Conecta ou Disconecta um dispositivo INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString dispoNome, QString porta)</function> : Configura a porta de conexão do dispositivo.</para></listitem>
<listitem><para><function>setINDIPort(TQString dispoNome, TQString porta)</function> : Configura a porta de conexão do dispositivo.</para></listitem>
<listitem><para><function>setINDIAction(QString dispoNome, QString acao)</function> : Ativa uma ação INDI. A ação pode ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção/ação</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString dispoNome, TQString acao)</function> : Ativa uma ação INDI. A ação pode ser qualquer <emphasis>elemento</emphasis> de uma <emphasis>propriedade de opção/ação</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString dispoNome, QString acao)</function> : Pausa a execução do script atá a <emphasis>propriedade</emphasis> de ação especificada retornar com estado OK.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString dispoNome, TQString acao)</function> : Pausa a execução do script atá a <emphasis>propriedade</emphasis> de ação especificada retornar com estado OK.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções de Telescópio: Funções para controlar o movimento e estado do telescópio.</para>
<listitem><para>Funções de Telescópio: Funções para controlar o movimento e estado do telescópio.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString dispoNome, QString acao)</function> : Configura o modo do telescópio ou ação. As opções disponíveis são SLEW, TRACK, SYNC, PARK, e ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString dispoNome, TQString acao)</function> : Configura o modo do telescópio ou ação. As opções disponíveis são SLEW, TRACK, SYNC, PARK, e ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString dispoNome, double RA, double DEC)</function> : Configura as coordenadas alvo JNow do telescópio para <emphasis>RA</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString dispoNome, double RA, double DEC)</function> : Configura as coordenadas alvo JNow do telescópio para <emphasis>RA</emphasis> e <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString dispoNome, QString objetoNome)</function> : Configura as coordenadas alvo JNow do telescópio para as coordenadas do <emphasis>objectName</emphasis>. O KStars procurará o nome do objeto no banco de dados e retornará a RA and Dec uma vez encontradas.</para></listitem>
<listitem><para><function>setINDITargetName(TQString dispoNome, TQString objetoNome)</function> : Configura as coordenadas alvo JNow do telescópio para as coordenadas do <emphasis>objectName</emphasis>. O KStars procurará o nome do objeto no banco de dados e retornará a RA and Dec uma vez encontradas.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString dispoNome, double longitude, double latitude)</function> : Configura a localização geográfica para a longitude e latitude especificadas. A longitude é calculada E de N. Por exemplo, as coordenadas de Calgary - Canada no KStars são longitude: -114 04 58 - latitude: 51 02 58. <emphasis>Somente</emphasis> longitudes negativas precisam ser convertidas. Para converter a longitude para a notação E de N, consideremos a longitude possitiva e adicionamos 180 graus a ela. Assim, em nosso exemplo, a longitude do INDI = 114 04 08 + 180 00 00 = 294 04 08 E de N.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString dispoNome, double longitude, double latitude)</function> : Configura a localização geográfica para a longitude e latitude especificadas. A longitude é calculada E de N. Por exemplo, as coordenadas de Calgary - Canada no KStars são longitude: -114 04 58 - latitude: 51 02 58. <emphasis>Somente</emphasis> longitudes negativas precisam ser convertidas. Para converter a longitude para a notação E de N, consideremos a longitude possitiva e adicionamos 180 graus a ela. Assim, em nosso exemplo, a longitude do INDI = 114 04 08 + 180 00 00 = 294 04 08 E de N.</para></listitem>
<listitem><para><function>setINDIUTC(QString dispoNome, QString DataHoraUTC)</function> : Configura a Data e Hora UTC do telescópio no formato ISO 8601. O formato é AAAA-MM-DDTHH:MM:SS (e.g. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString dispoNome, TQString DataHoraUTC)</function> : Configura a Data e Hora UTC do telescópio no formato ISO 8601. O formato é AAAA-MM-DDTHH:MM:SS (e.g. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções de Focador: Funções para controlar o movimento e estado do focador.</para>
<listitem><para>Funções de Focador: Funções para controlar o movimento e estado do focador.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString dispoNome, QString acao)</function> : Configura a velocidade do focador. As opções disponíveis são FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, e FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString dispoNome, TQString acao)</function> : Configura a velocidade do focador. As opções disponíveis são FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM, e FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString dispoNome, int espera)</function> : Configura a duração em segundos para qualquer operação subsequente de startINDIFocus.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString dispoNome, int espera)</function> : Configura a duração em segundos para qualquer operação subsequente de startINDIFocus.</para></listitem>
<listitem><para><function>startINDIFocus(QString dispoNome, int focoDir)</function> : Move o focador seja para próximo (focoDir = 0) ou para longe (focoDir = 1). A velocidade e duração desta operação é configurada pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString dispoNome, int focoDir)</function> : Move o focador seja para próximo (focoDir = 0) ou para longe (focoDir = 1). A velocidade e duração desta operação é configurada pelas funções <function>setINDIFocusSpeed()</function> e <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Funções de Câmera/CCD: Funções para controlar as propriedades e estado da câmera/CCD.</para>
<listitem><para>Funções de Câmera/CCD: Funções para controlar as propriedades e estado da câmera/CCD.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString dispoNome, int temp)</function> : Configura a temperatura alvo do chip CCD em graus celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString dispoNome, int temp)</function> : Configura a temperatura alvo do chip CCD em graus celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString dispoNome, QString tipo)</function> : Configura o tipo de quadro CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, e FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString dispoNome, TQString tipo)</function> : Configura o tipo de quadro CCD. As opções disponíveis são FRAME_LIGHT, FRAME_BIAS, FRAME_DARK, e FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString dispoNome, int espera)</function> : Inicia a exposição do CCD/Câmera pela duração especificada por <emphasis>espera</emphasis> em segundos.</para></listitem>
<listitem><para><function>startINDIExposure(TQString dispoNome, int espera)</function> : Inicia a exposição do CCD/Câmera pela duração especificada por <emphasis>espera</emphasis> em segundos.</para></listitem>
<para>é um pouco diferente que dereferenciar um ponteiro NULL. Você não disse o objeto o que ele é, e agora você tenta usá-lo. A suposição aqui é que você deseja ter uma nova instância local do objeto Synth::PLAY. É claro que você deve ter desejado algo como isso (como criar o objeto em algum outro local, ou usar um objeto remoto existente). No entanto, é um atalho conveniente para criar objetos. A criação relaxada não funcionará uma vez que você atribua algo mais (como uma referência null). </para>
<para>é um pouco diferente que dereferenciar um ponteiro NULL. Você não disse o objeto o que ele é, e agora você tenta usá-lo. A suposição aqui é que você deseja ter uma nova instância local do objeto Synth::PLAY. É claro que você deve ter desejado algo como isso (como criar o objeto em algum outro local, ou usar um objeto remoto existente). No entanto, é um atalho conveniente para criar objetos. A criação relaxada não funcionará uma vez que você atribua algo mais (como uma referência null). </para>
<para>O equivalente em termos de C++ deve ser <programlisting>
<para>O equivalente em termos de C++ deve ser <programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> que obviamente em C++ocasiona falhas de segmentação. Assim isto é diferente aqui. Esta criação relaxada é um truque especialmente porque não é necessário que uma implementação para sua interface exista. </para>
</programlisting> que obviamente em C++ocasiona falhas de segmentação. Assim isto é diferente aqui. Esta criação relaxada é um truque especialmente porque não é necessário que uma implementação para sua interface exista. </para>
<para>Não existe necessidade de basear uma plataforma de multimídia no &Qt;. Ao decidir isso, e usando toda aquela serialização e outras funcionalidades de fluxo do &Qt;, iria conduzir facilmente a que a plataforma se tornasse apenas para o &Qt; (ou apenas para o &kde;). Quer dizer: tão logo se veja os GNOMEs começando a usar o &DCOP;, também, ou algo do gênero, provavelmente eu estarei errado. </para>
<para>Não existe necessidade de basear uma plataforma de multimídia no &Qt;. Ao decidir isso, e usando toda aquela serialização e outras funcionalidades de fluxo do &Qt;, iria conduzir facilmente a que a plataforma se tornasse apenas para o &Qt; (ou apenas para o &kde;). Quer dizer: tão logo se veja os GNOMEs começando a usar o &DCOP;, também, ou algo do gênero, provavelmente eu estarei errado. </para>
<para>Enquanto se sabe que o &DCOP; basicamente não sabe nada sobre os tipos de dados que envia, de modo que você poderia usar o &DCOP; sem usar o &Qt;, veja como é usado no uso do dia-a-dia do &kde;: as pessoas enviam tipos como o <classname>QString</classname>, o <classname>QRect</classname>, o <classname>QPixmap</classname>, o <classname>QCString</classname>, ..., de um lado para o outro. Estes usam a serialização do &Qt;. Por isso, se alguém optar por suportar o &DCOP; em um programa do GNOME, ele teria de afirmar que usava os tipos <classname>QString</classname>,... (ainda que não o faça, de fato) e emular a forma como o &Qt; faz a transmissão, ou então teria de enviar outros tipos de cadeias de caracteres, imagens e retângulos, o que deixaria de ser interoperável. </para>
<para>Enquanto se sabe que o &DCOP; basicamente não sabe nada sobre os tipos de dados que envia, de modo que você poderia usar o &DCOP; sem usar o &Qt;, veja como é usado no uso do dia-a-dia do &kde;: as pessoas enviam tipos como o <classname>TQString</classname>, o <classname>QRect</classname>, o <classname>QPixmap</classname>, o <classname>QCString</classname>, ..., de um lado para o outro. Estes usam a serialização do &Qt;. Por isso, se alguém optar por suportar o &DCOP; em um programa do GNOME, ele teria de afirmar que usava os tipos <classname>TQString</classname>,... (ainda que não o faça, de fato) e emular a forma como o &Qt; faz a transmissão, ou então teria de enviar outros tipos de cadeias de caracteres, imagens e retângulos, o que deixaria de ser interoperável. </para>
<para>Bem, seja o que for, o &arts; pretendeu sempre funcionar com ou sem o &kde;, com ou sem o &Qt;, com ou sem o X11, e talvez com ou sem o &Linux; (e não há problema nenhum com as pessoas que o transpõem para um sistema operacional proprietário conhecido). </para>
<para>Bem, seja o que for, o &arts; pretendeu sempre funcionar com ou sem o &kde;, com ou sem o &Qt;, com ou sem o X11, e talvez com ou sem o &Linux; (e não há problema nenhum com as pessoas que o transpõem para um sistema operacional proprietário conhecido). </para>
<para>Define a cor de fundo para mostrar a mensagem. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>QColor::name()</methodname>) onde o RR, GG and BB são valores de dois dígitos hexadecimais para o vermelho, verde e azul. Em alternativa, o texto poderá ser um nome da base de dados de cores do X, ⪚ <quote>red</quote> ou <quote>steelblue</quote>. Configure o texto como vazio para indicar a cor de fundo padrão.</para>
<para>Define a cor de fundo para mostrar a mensagem. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>TQColor::name()</methodname>) onde o RR, GG and BB são valores de dois dígitos hexadecimais para o vermelho, verde e azul. Em alternativa, o texto poderá ser um nome da base de dados de cores do X, ⪚ <quote>red</quote> ou <quote>steelblue</quote>. Configure o texto como vazio para indicar a cor de fundo padrão.</para>
<para>Define a cor de fundo para mostrar o arquivo. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>QColor::name()</methodname>) onde o RR, GG and BB são valores de dois dígitos hexadecimais para o vermelho, verde e azul. Em alternativa, o texto poderá ser um nome da base de dados de cores do X, ⪚ <quote>red</quote> ou <quote>steelblue</quote>. Configure o texto vazio para indicar a cor de fundo padrão.</para>
<para>Define a cor de fundo para mostrar o arquivo. O texto poderá estar no formato <quote>#RRGGBB</quote> (tal como é devolvido pelo <methodname>TQColor::name()</methodname>) onde o RR, GG and BB são valores de dois dígitos hexadecimais para o vermelho, verde e azul. Em alternativa, o texto poderá ser um nome da base de dados de cores do X, ⪚ <quote>red</quote> ou <quote>steelblue</quote>. Configure o texto vazio para indicar a cor de fundo padrão.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -1995,29 +1995,29 @@
<refpurpose>agenda um novo alarme que executa um determinado comando.</refpurpose>
<refpurpose>agenda um novo alarme que executa um determinado comando.</refpurpose>
<para>Isto assume que você está dentro de um arquivo do &kommander; e que tem acesso ao especial @pid, que contém o ID do processo. De fato, é mais simples substituir o <quote>kmdr-executor-@pid</quote> por @dcopid. Contudo, você poderá usar esta sintaxe (obviamente sem os especiais) a partir da linha de comando ou com algum programa externo para alterar a janela do &kommander;. </para>
<para>Isto assume que você está dentro de um arquivo do &kommander; e que tem acesso ao especial @pid, que contém o ID do processo. De fato, é mais simples substituir o <quote>kmdr-executor-@pid</quote> por @dcopid. Contudo, você poderá usar esta sintaxe (obviamente sem os especiais) a partir da linha de comando ou com algum programa externo para alterar a janela do &kommander;. </para>
<para>Uma vez que o &kommander; não tem um processador completo na sua fase 'Alpha', se você quiser usar o &DCOP; interno, que é muito mais rápido, a partir de outra janela do aplicativo (o &DCOP; do console é bastante lento), será mais complicado porque você precisa fornecer muitas informações, incluindo um protótipo da chamada. A chamada acima ficaria igual a: </para>
<para>Uma vez que o &kommander; não tem um processador completo na sua fase 'Alpha', se você quiser usar o &DCOP; interno, que é muito mais rápido, a partir de outra janela do aplicativo (o &DCOP; do console é bastante lento), será mais complicado porque você precisa fornecer muitas informações, incluindo um protótipo da chamada. A chamada acima ficaria igual a: </para>
<para>Na época em que isto foi escrito, você deverá saber que o encadeamento de chamadas de &DCOP; dentro de estruturas da linguagem de programação (como o <application>bash</application>) significa que você precisa usar chamadas dos métodos a partir do console. <emphasis>Se usar o &DCOP; interno, todos os especiais do &kommander; serão executados primeiro e depois o programa será então executado.</emphasis> </para>
<para>Na época em que isto foi escrito, você deverá saber que o encadeamento de chamadas de &DCOP; dentro de estruturas da linguagem de programação (como o <application>bash</application>) significa que você precisa usar chamadas dos métodos a partir do console. <emphasis>Se usar o &DCOP; interno, todos os especiais do &kommander; serão executados primeiro e depois o programa será então executado.</emphasis> </para>
<para>Existe uma nova forma simplificada de usar o &DCOP; dentro do &kommander;, através de uma sintaxe de objetos. Digamos que você deseje alterar o texto num elemento chamado @CampoTexto1. Seria algo semelhante ao seguinte. </para>
<para>Existe uma nova forma simplificada de usar o &DCOP; dentro do &kommander;, através de uma sintaxe de objetos. Digamos que você deseje alterar o texto num elemento chamado @CampoTexto1. Seria algo semelhante ao seguinte. </para>
<para>Devolve o valor da variável global indicada. Quando um programa é rodado dentro de uma janela do &kommander;, todas as variáveis (não-globais) definidas neste programa deixarão de existir depois do programa terminar e, como tal, não estarão disponíveis para outros processos de programas ou numa nova instância do processo que invoca. O <quote>âmbito</quote> global significa que a variável irá existir para qualquer processo da janela até que esta seja fechada. Você poderá alterar estas variáveis em qualquer momento com uma chamada nova ao <function>@setGlobal</function>. </para>
<para>Devolve o valor da variável global indicada. Quando um programa é rodado dentro de uma janela do &kommander;, todas as variáveis (não-globais) definidas neste programa deixarão de existir depois do programa terminar e, como tal, não estarão disponíveis para outros processos de programas ou numa nova instância do processo que invoca. O <quote>âmbito</quote> global significa que a variável irá existir para qualquer processo da janela até que esta seja fechada. Você poderá alterar estas variáveis em qualquer momento com uma chamada nova ao <function>@setGlobal</function>. </para>
<para>Cria uma variável que é global para o processo da janela e atribui o valor a ela. Este valor poderá ser obtido com a chamada global(QString nomeVariavel) ou alterado novamente. </para>
<para>Cria uma variável que é global para o processo da janela e atribui o valor a ela. Este valor poderá ser obtido com a chamada global(TQString nomeVariavel) ou alterado novamente. </para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
</variablelist>
</variablelist>
@ -48,7 +48,7 @@
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>changeWidgetText(QString texto)</term>
<term>changeWidgetText(TQString texto)</term>
<listitem>
<listitem>
<para>Isto deverá ser mudado para 'setWidgetText' e este nome poderá vir a ficar obsoleto. Isto remove o texto apresentado no elemento gráfico e substitui-o pelo texto indicado. </para>
<para>Isto deverá ser mudado para 'setWidgetText' e este nome poderá vir a ficar obsoleto. Isto remove o texto apresentado no elemento gráfico e substitui-o pelo texto indicado. </para>
</listitem>
</listitem>
@ -66,7 +66,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>setAssociatedText(QString texto)</term>
<term>setAssociatedText(TQString texto)</term>
<listitem>
<listitem>
<para>Isto configura o texto padrão do Texto do &kommander;. Isto é tipicamente igual a <quote>@widgetText</quote> para mostrar o que é inserido no elemento gráfico. É pouco provável que tenha muita necessidade disto, mas se o fizer, será aqui. Aplica-se a todos os elementos que possam conter dados. </para>
<para>Isto configura o texto padrão do Texto do &kommander;. Isto é tipicamente igual a <quote>@widgetText</quote> para mostrar o que é inserido no elemento gráfico. É pouco provável que tenha muita necessidade disto, mas se o fizer, será aqui. Aplica-se a todos os elementos que possam conter dados. </para>
</listitem>
</listitem>
@ -78,7 +78,7 @@
<title>O &DCOP; para os Elementos ListBox e ComboBox</title>
<title>O &DCOP; para os Elementos ListBox e ComboBox</title>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>addListItem(QString item, int indice)</term>
<term>addListItem(TQString item, int indice)</term>
<listitem>
<listitem>
<para>Adiciona um item a um elemento ListBox no índice indicado. O índice da lista começa em zero. Para adicionar ao fim da lista, use -1. </para>
<para>Adiciona um item a um elemento ListBox no índice indicado. O índice da lista começa em zero. Para adicionar ao fim da lista, use -1. </para>
</listitem>
</listitem>
@ -90,7 +90,7 @@
</listitem>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<varlistentry>
<term>addUniqueItem(QString item)</term>
<term>addUniqueItem(TQString item)</term>
<listitem>
<listitem>
<para>O 'addUniqueItem' irá adicionar um item ao fim da lista, somente se for único. </para>
<para>O 'addUniqueItem' irá adicionar um item ao fim da lista, somente se for único. </para>
</listitem>
</listitem>
@ -126,7 +126,7 @@
<title>O &DCOP; para os Elementos CheckBox e RadioButton</title>
<title>O &DCOP; para os Elementos CheckBox e RadioButton</title>
<listitem><para>Отрицающий просмотр проверяет текст на предмет несовпадения с <emphasis>ШАБЛОНОМ</emphasis>.</para>
<listitem><para>Отрицающий просмотр проверяет текст на предмет несовпадения с <emphasis>ШАБЛОНОМ</emphasis>.</para>
<para>Выражение <userinput>const \w+\b(?!\s*&)</userinput> совпадёт с <quote>const char</quote> в строке <quote>const char* foo</quote>, но не совпадёт с <quote>const QString</quote> в <quote>const QString& bar</quote>, поскольку <quote>&</quote> совпадает с шаблоном отрицающего просмотра.</para>
<para>Выражение <userinput>const \w+\b(?!\s*&)</userinput> совпадёт с <quote>const char</quote> в строке <quote>const char* foo</quote>, но не совпадёт с <quote>const TQString</quote> в <quote>const TQString& bar</quote>, поскольку <quote>&</quote> совпадает с шаблоном отрицающего просмотра.</para>
<listitem><para>Классы модуля должны обеспечивать <literal>статическую</literal> функцию с названием <function>names</function>, которая возвращает список названий, под которыми она может быть задействована.</para></listitem>
<listitem><para>Классы модуля должны обеспечивать <literal>статическую</literal> функцию с названием <function>names</function>, которая возвращает список названий, под которыми она может быть задействована.</para></listitem>
<listitem><para>Чтобы модуль можно было настраивать из Центра управления KDE, он должен включать класс, основанный на классе <literal>ThemeEngineConfig</literal>.</para></listitem>
<listitem><para>Чтобы модуль можно было настраивать из Центра управления KDE, он должен включать класс, основанный на классе <literal>ThemeEngineConfig</literal>.</para></listitem>
<listitem><para>Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций: <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> и <function>slotUpdateSteps</function>, чтобы обеспечить возможность использования.</para></listitem>
<listitem><para>Классы модуля должны перекрывать хотя бы одну из следующих виртуальных функций: <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> и <function>slotUpdateSteps</function>, чтобы обеспечить возможность использования.</para></listitem>
<listitem><para>Разработчик должен создать конструктор <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal>, чтобы модуль можно было использовать из <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Разработчик должен создать конструктор <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal>, чтобы модуль можно было использовать из <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходному коду.</para>
<para>Последнее требование может показаться сложным, но, как мы увидим позже, вы можете обычно игнорировать его, добавив одну строку к исходному коду.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Давайте проанализируем вышеприведённое. Класс <classname>Theme2k</classname>, унаследованный от <classname>ThemeEngine</classname> удовлетворяет объявлениям. Он обеспечивает метод <methodname>Theme2k::names()</methodname>, и имеет конструктор, который принимает необходимые параметры: <function>Theme2k( QWidget *, const char *, const QStringList& );</function>, и к тому же обеспечивает простой метод <methodname>Theme2k::slotSetText()</methodname>. На данном этапе вам не следует беспокоиться насчёт класса <classname>RotWidget</classname>. Это небольшой элемент графического интерфейса, который делает программу более наглядной для пользователя. Наш подключаемый модуль очень прост: он не показывает ни значков, ни индикатора загрузки. Если вы хотите использовать значки, перекройте функцию <function>slotSetPixmap</function>. Подобные функции есть для установки индикатора загрузки (<function>slotUpdateSteps</function>) и увеличения счётчика (<function>slotUpdateProgress</function>) текущего шага. </para>
<para>Давайте проанализируем вышеприведённое. Класс <classname>Theme2k</classname>, унаследованный от <classname>ThemeEngine</classname> удовлетворяет объявлениям. Он обеспечивает метод <methodname>Theme2k::names()</methodname>, и имеет конструктор, который принимает необходимые параметры: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function>, и к тому же обеспечивает простой метод <methodname>Theme2k::slotSetText()</methodname>. На данном этапе вам не следует беспокоиться насчёт класса <classname>RotWidget</classname>. Это небольшой элемент графического интерфейса, который делает программу более наглядной для пользователя. Наш подключаемый модуль очень прост: он не показывает ни значков, ни индикатора загрузки. Если вы хотите использовать значки, перекройте функцию <function>slotSetPixmap</function>. Подобные функции есть для установки индикатора загрузки (<function>slotUpdateSteps</function>) и увеличения счётчика (<function>slotUpdateProgress</function>) текущего шага. </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Реализация подключаемого модуля</title>
<title>Реализация подключаемого модуля</title>
@ -686,7 +686,7 @@ private:
<para>Объявление макроса <constant>K_EXPORT_COMPONENT_FACTORY</constant> содержится в файле <filename>kgenericfactory.h</filename>. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.</para>
<para>Объявление макроса <constant>K_EXPORT_COMPONENT_FACTORY</constant> содержится в файле <filename>kgenericfactory.h</filename>. Теперь перейдём к конструктору. Так как подключаемый модуль совсем прост, конструктор тоже несложен.</para>
<para>Интерфейс &kstars; <abbrev>DCOP</abbrev> содержит следующие функции: <itemizedlist>
<para>Интерфейс &kstars; <abbrev>DCOP</abbrev> содержит следующие функции: <itemizedlist>
<listitem><para><function> lookTowards( const QString direction )</function>: Центрировать экран на направление, переданное в качестве аргумента. Это может быть название любого объекта на небе, или одно из следующих слов или сокращений: zenith (или z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> lookTowards( const TQString direction )</function>: Центрировать экран на направление, переданное в качестве аргумента. Это может быть название любого объекта на небе, или одно из следующих слов или сокращений: zenith (или z), north (n), northeast (ne), east (e), southeast (se), south (s), southwest(sw), west(w), northwest (nw). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Центрирует экран на переданные в качестве аргумента экваториальные координаты. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dec )</function>: Центрирует экран на переданные в качестве аргумента экваториальные координаты. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Приостанавливает выполнение сценария на t секунд. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Приостанавливает выполнение сценария на t секунд. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Приостанавливает выполнение сценария до тех пор, пока не будет нажата определённая клавиша. С помощью этой функции вы не можете определить комбинации клавиш (таких как <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); используйте простые клавиши. Укажите <quote>space</quote> чтобы определить пробел. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Приостанавливает выполнение сценария до тех пор, пока не будет нажата определённая клавиша. С помощью этой функции вы не можете определить комбинации клавиш (таких как <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>); используйте простые клавиши. Укажите <quote>space</quote> чтобы определить пробел. </para></listitem>
<listitem><para><function> changeViewOption( const QString option, const QString value )</function>: Изменить параметр вида. Доступно множество параметров; всё что можно изменить в окне <guilabel>Настроить &kstars;</guilabel> может быть также изменено с помощью этой функции. Первый аргумент - название параметра (названия совпадают с названиями в конфигурационном файле <filename>kstarsrc</filename>), второй аргумент - новое значение. Если вы случайно введёте неправильноле значение, программа завершиться с ошибкой. </para></listitem>
<listitem><para><function> changeViewOption( const TQString option, const TQString value )</function>: Изменить параметр вида. Доступно множество параметров; всё что можно изменить в окне <guilabel>Настроить &kstars;</guilabel> может быть также изменено с помощью этой функции. Первый аргумент - название параметра (названия совпадают с названиями в конфигурационном файле <filename>kstarsrc</filename>), второй аргумент - новое значение. Если вы случайно введёте неправильноле значение, программа завершиться с ошибкой. </para></listitem>
<listitem><para><function> setGeoLocation( const QString city, const QString province, const QString country )</function>: Изменить географическое местоположение на заданный город. Если такого города нет в базе данных, то ничего не произойдёт. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString city, const TQString province, const TQString country )</function>: Изменить географическое местоположение на заданный город. Если такого города нет в базе данных, то ничего не произойдёт. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Остановить "часы" симуляции. </para></listitem>
<listitem><para><function> stop()</function> [clock]: Остановить "часы" симуляции. </para></listitem>
<listitem><para>Основные функции устройств (General). Например, функции включения и выключения устройств и так далее.</para>
<listitem><para>Основные функции устройств (General). Например, функции включения и выключения устройств и так далее.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString deviceName, bool useLocal)</function>: установить соединение с устройством INDI в локальном или серверном режиме.</para></listitem>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function>: установить соединение с устройством INDI в локальном или серверном режиме.</para></listitem>
<listitem><para><function>shutdownINDI (QString deviceName)</function>: выключить устройство INDI.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function>: выключить устройство INDI.</para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function>: подключиться или отключиться от устройства INDI.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function>: подключиться или отключиться от устройства INDI.</para></listitem>
<listitem><para><function>setINDIPort(QString deviceName, QString port)</function>: указать порт подключения к устройству INDI.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function>: указать порт подключения к устройству INDI.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function>: выполнить действие на устройстве INDI. Действие может быть любым <emphasis>элементом свойства-переключателя</emphasis></para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function>: выполнить действие на устройстве INDI. Действие может быть любым <emphasis>элементом свойства-переключателя</emphasis></para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function>: приостановить выполнение сценария, пока действие не возвратит успешное состояние.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function>: приостановить выполнение сценария, пока действие не возвратит успешное состояние.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Функции телескопов (Telescope): функции управления движением телескопа и его состоянием.</para>
<listitem><para>Функции телескопов (Telescope): функции управления движением телескопа и его состоянием.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function>: Установить действие телескопа. Возможные значения: SLEW, TRACK, SYNC, PARK и ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function>: Установить действие телескопа. Возможные значения: SLEW, TRACK, SYNC, PARK и ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function>: переместить фокус наблюдения на место, заданное координатами.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function>: переместить фокус наблюдения на место, заданное координатами.</para></listitem>
<listitem><para><function>setINDITargetName(QString deviceName, QString objectName)</function>Показать переместить фокус наблюдения на объект по имени <emphasis>objectName</emphasis>. &kstars; ищет имя объекта в своей базе данных и автоматически задаёт значения прямого восхождения и склонения, если они есть в базе данных.</para></listitem>
<listitem><para><function>setINDITargetName(TQString deviceName, TQString objectName)</function>Показать переместить фокус наблюдения на объект по имени <emphasis>objectName</emphasis>. &kstars; ищет имя объекта в своей базе данных и автоматически задаёт значения прямого восхождения и склонения, если они есть в базе данных.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function>Показать установить местонахождение телескопа в виде долготы и широты. Долгота отсчитывается от Гринвича (Великобритания) на восток, хотя широко используются отрицательные долготы для западного полушария, INDI требует использовать значения долготы от 0 до 360 градусов. Поэтому, если у вас отрицательная долгота, просто добавьте к ней 360 градусов и получите требуемое значение для INDI. Например, координаты Калгари (Канада) в &kstars; имеют долготу -114 04 58, широту 51 02 58. Тогда долгота, требуемая INDI, будет 360 - 114.083 = 245.917 градусов.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function>Показать установить местонахождение телескопа в виде долготы и широты. Долгота отсчитывается от Гринвича (Великобритания) на восток, хотя широко используются отрицательные долготы для западного полушария, INDI требует использовать значения долготы от 0 до 360 градусов. Поэтому, если у вас отрицательная долгота, просто добавьте к ней 360 градусов и получите требуемое значение для INDI. Например, координаты Калгари (Канада) в &kstars; имеют долготу -114 04 58, широту 51 02 58. Тогда долгота, требуемая INDI, будет 360 - 114.083 = 245.917 градусов.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function>Показать установить время UTC на устройстве в формате ISO 8601, т.е. в формате ГГГГ-ММ-ДДTЧЧ:MM:СС (например 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function>Показать установить время UTC на устройстве в формате ISO 8601, т.е. в формате ГГГГ-ММ-ДДTЧЧ:MM:СС (например 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Функции камеры/CCD (Camera/CCD): функции управления камерой/CCD и получения их состояния.</para>
<listitem><para>Функции камеры/CCD (Camera/CCD): функции управления камерой/CCD и получения их состояния.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function>Показать установить температуру сенсоров CCD в градусах Цельсия.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function>Показать установить температуру сенсоров CCD в градусах Цельсия.</para></listitem>
<listitem><para><function>setINDIFrameType(QString deviceName, QString type)</function>Показать установить тип кадра CCD. Возможные значения: FRAME_LIGHT, FRAME_BIAS, FRAME_DARK и FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function>Показать установить тип кадра CCD. Возможные значения: FRAME_LIGHT, FRAME_BIAS, FRAME_DARK и FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function>Показать задать экспозицию камеры/CCD в секундах.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function>Показать задать экспозицию камеры/CCD в секундах.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Функции фокусировки (Focuser): функции управления движением и получения сведений от фокусирующего механизма.</para>
<listitem><para>Функции фокусировки (Focuser): функции управления движением и получения сведений от фокусирующего механизма.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function>Показать установить скорость фокусирующего механизма. Допустимые значения FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM и FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function>Показать установить скорость фокусирующего механизма. Допустимые значения FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM и FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function>Показать установить время задержки фокусировки в секундах. Задержка применяется к любой фокусирующей операции телескопа, производимой командой startINDIFocus.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function>Показать установить время задержки фокусировки в секундах. Задержка применяется к любой фокусирующей операции телескопа, производимой командой startINDIFocus.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function>Показать фокусировать на короткое расстояние (focusDir = 0) или на бесконечность (focusDir = 1). Скорость и время фокусировки устанавливаются функциями <function>setINDIFocusSpeed()</function> и <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function>Показать фокусировать на короткое расстояние (focusDir = 0) или на бесконечность (focusDir = 1). Скорость и время фокусировки устанавливаются функциями <function>setINDIFocusSpeed()</function> и <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Функции фильтра (Filter): функции управления светофильтрами.</para>
<listitem><para>Функции фильтра (Filter): функции управления светофильтрами.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function>: установить светофильтр <varname>filter_num</varname>. Пользователь может присваивать псевдонимы номерам фильтров в диалоге, открываемом командой <guimenuitem>Настроить INDI</guimenuitem> меню <guimenu>Устройства</guimenu> (например, светофильтр 1 — Красный, светофильтр 2 — Зелёный и так далее).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function>: установить светофильтр <varname>filter_num</varname>. Пользователь может присваивать псевдонимы номерам фильтров в диалоге, открываемом командой <guimenuitem>Настроить INDI</guimenuitem> меню <guimenu>Устройства</guimenu> (например, светофильтр 1 — Красный, светофильтр 2 — Зелёный и так далее).</para></listitem>
<para>это несколько отличается от разыменования указателя на NULL. Вы вообще не указали объекту, чем он является, и пытаетесь использовать его. Вообразим здесь, что вы хотели иметь новую локальную копию объекта Arts::Synth_PLAY. Конечно вы могли хотеть что-то ещё (вроде создания объекта где-то ещё или использования существующего внешнего объекта. Так или иначе, объект будет как-то создан, но созданный подобным образом объект не будет работать до тех пор пока вы не присвоите ему какое-то значение (также как и нулевая ссылка). </para>
<para>это несколько отличается от разыменования указателя на NULL. Вы вообще не указали объекту, чем он является, и пытаетесь использовать его. Вообразим здесь, что вы хотели иметь новую локальную копию объекта Arts::Synth_PLAY. Конечно вы могли хотеть что-то ещё (вроде создания объекта где-то ещё или использования существующего внешнего объекта. Так или иначе, объект будет как-то создан, но созданный подобным образом объект не будет работать до тех пор пока вы не присвоите ему какое-то значение (также как и нулевая ссылка). </para>
<para>Эквивалент в терминах С++<programlisting>
<para>Эквивалент в терминах С++<programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> что в C++ безусловно приводит к ошибке обращения к памяти. Итак, есть отличия. Такое создание объекта может быть ошибочным потому, что необязательно существует реализация вашего интерфейса. </para>
</programlisting> что в C++ безусловно приводит к ошибке обращения к памяти. Итак, есть отличия. Такое создание объекта может быть ошибочным потому, что необязательно существует реализация вашего интерфейса. </para>
<para>Нет необходимости писать связующее ПО для мультимедиа в &Qt;, иначе оно станет &Qt;-зависимым. </para>
<para>Нет необходимости писать связующее ПО для мультимедиа в &Qt;, иначе оно станет &Qt;-зависимым. </para>
<para>Насколько я знаю, тип пересылаемых по &DCOP; данных не важен, поэтому &DCOP; может использоваться отдельно от &Qt;. Вот пример повседневного использования в &kde;: пользователи посылают типы <classname>QString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ... Они используют сериализацию &Qt;. Поэтому если кто-то решит включить поддержку &DCOP;, например, в GNOME, он не сможет использовать типы <classname>QString</classname> и др. и ему придётся эмулировать работу &Qt; с потоками или посылать строку, пиксельные изображения и типы rect, что, конечно, никуда не годится. </para>
<para>Насколько я знаю, тип пересылаемых по &DCOP; данных не важен, поэтому &DCOP; может использоваться отдельно от &Qt;. Вот пример повседневного использования в &kde;: пользователи посылают типы <classname>TQString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, ... Они используют сериализацию &Qt;. Поэтому если кто-то решит включить поддержку &DCOP;, например, в GNOME, он не сможет использовать типы <classname>TQString</classname> и др. и ему придётся эмулировать работу &Qt; с потоками или посылать строку, пиксельные изображения и типы rect, что, конечно, никуда не годится. </para>
<para>&arts; не привязан к &kde;, он может работать как с &Qt; и X11, так и без них, и даже без &Linux; (я знаю людей, у которых он нормально работает в распространённых коммерческих ОС). </para>
<para>&arts; не привязан к &kde;, он может работать как с &Qt; и X11, так и без них, и даже без &Linux; (я знаю людей, у которых он нормально работает в распространённых коммерческих ОС). </para>
<para>Второй объект нашей программы - кнопка, экземпляр класса <classname>QPushButton</classname>. Из двух доступных конструкторов экземпляров этого класса мы воспользовались вторым: он принимает в виде аргумента строку текста, которая будет показана на кнопке. Затем методом <methodname>resize()</methodname> мы изменяем размер кнопки, чтобы вся строка была видна на кнопке. </para>
<para>Второй объект нашей программы - кнопка, экземпляр класса <classname>QPushButton</classname>. Из двух доступных конструкторов экземпляров этого класса мы воспользовались вторым: он принимает в виде аргумента строку текста, которая будет показана на кнопке. Затем методом <methodname>resize()</methodname> мы изменяем размер кнопки, чтобы вся строка была видна на кнопке. </para>
<para>Далее идёт метод <methodname>show()</methodname>. Ноего нет в описании класса <classname>QPushButton</classname>. Этот класс наследует методы класса <classname>QButton</classname>, а тот, в свою очередь, наследует методы <classname>QWidget</classname>. Этот класс содержит огромное количество методов, в том числе <methodname>show()</methodname>. Итак, что же делалось с кнопкой: <orderedlist>
<para>Далее идёт метод <methodname>show()</methodname>. Ноего нет в описании класса <classname>QPushButton</classname>. Этот класс наследует методы класса <classname>QButton</classname>, а тот, в свою очередь, наследует методы <classname>TQWidget</classname>. Этот класс содержит огромное количество методов, в том числе <methodname>show()</methodname>. Итак, что же делалось с кнопкой: <orderedlist>
<listitem><para>Создаём экземпляр класса <classname>QPushButton</classname>, используя второй конструктор для указания надписи на кнопке</para></listitem>
<listitem><para>Создаём экземпляр класса <classname>QPushButton</classname>, используя второй конструктор для указания надписи на кнопке</para></listitem>
<listitem><para>Изменяем размер кнопки</para></listitem>
<listitem><para>Изменяем размер кнопки</para></listitem>
<listitem><para>Делаем основным элементом управления для переменной а, экземпляра класса <classname>QApplication</classname></para></listitem>
<listitem><para>Делаем основным элементом управления для переменной а, экземпляра класса <classname>QApplication</classname></para></listitem>
<listitem><para>Вызываем метод <methodname>show()</methodname>, который приводит к отображению элемента управления. Он наследуется от класса <classname>QWidget</classname></para></listitem>
<listitem><para>Вызываем метод <methodname>show()</methodname>, который приводит к отображению элемента управления. Он наследуется от класса <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>После вызова метода <methodname>exec()</methodname>, приложение становится видимым пользователю. Окно приложения содержит кнопку "Hello world!". Примечание: GUI-программы ведут себя несколько отлично от процедурных. Главное отличие состоит в том, что приложение входит в т.н. "главный цикл событий" ("main event loop"). Это означает, что программа ожидает действий со стороны пользователя, и выдаёт на них определённую реакцию. Следующий раздел разъясняет, что это означает для программиста, и как эти события обрабатываются в Qt. </para>
<para>После вызова метода <methodname>exec()</methodname>, приложение становится видимым пользователю. Окно приложения содержит кнопку "Hello world!". Примечание: GUI-программы ведут себя несколько отлично от процедурных. Главное отличие состоит в том, что приложение входит в т.н. "главный цикл событий" ("main event loop"). Это означает, что программа ожидает действий со стороны пользователя, и выдаёт на них определённую реакцию. Следующий раздел разъясняет, что это означает для программиста, и как эти события обрабатываются в Qt. </para>
<note><para>Для опытных: кнопка не имеет родителя, это значит, что это элемент управления верхнего уровня (top-level) и выполняется в локальном цикле событий, которому не нужно ждать главного цикла событий. Подробно это объяснено в документации класса QWidget и The KDE Library Reference Guide</para>
<note><para>Для опытных: кнопка не имеет родителя, это значит, что это элемент управления верхнего уровня (top-level) и выполняется в локальном цикле событий, которому не нужно ждать главного цикла событий. Подробно это объяснено в документации класса TQWidget и The KDE Library Reference Guide</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Теперь оживим нашу программу добавлением обработчика событий. В общем, есть два способа взаимодействия пользователя с программой - клавиатурой и мышью. В обоих случаях графический интерфейс предоставляет механизмы регистрации новых событий от этих устройств и методы их обработки. </para>
<para>Теперь оживим нашу программу добавлением обработчика событий. В общем, есть два способа взаимодействия пользователя с программой - клавиатурой и мышью. В обоих случаях графический интерфейс предоставляет механизмы регистрации новых событий от этих устройств и методы их обработки. </para>
<para>Оконная система посылает все события соответствующему приложению. <classname>QApplication</classname> пересылает их активному окну в виде <classname>QEvent</classname> и элементы управления затем решают, что при этом делать. Соответствующий элемент управления принимает событие и обрабатывает <methodname>QWidget::event (QEvent*)</methodname>, в котором определяется тип события и выдаётся соответствующая реакция; <methodname>event()</methodname> - главный обработчик событий. Он передаёт событие т.н. фильтрам событий, которые определяют, что произошло и что делать с этим событием. Если фильтра для данного типа события нет, вызываются специальные обработчики событий. Они вызывают соответствующие предопределённые методы: <itemizedlist>
<para>Оконная система посылает все события соответствующему приложению. <classname>QApplication</classname> пересылает их активному окну в виде <classname>QEvent</classname> и элементы управления затем решают, что при этом делать. Соответствующий элемент управления принимает событие и обрабатывает <methodname>TQWidget::event (QEvent*)</methodname>, в котором определяется тип события и выдаётся соответствующая реакция; <methodname>event()</methodname> - главный обработчик событий. Он передаёт событие т.н. фильтрам событий, которые определяют, что произошло и что делать с этим событием. Если фильтра для данного типа события нет, вызываются специальные обработчики событий. Они вызывают соответствующие предопределённые методы: <itemizedlist>
<listitem><para>События с клавиатуры - нажатие клавиш TAB и Shift-TAB:</para>
<listitem><para>События с клавиатуры - нажатие клавиш TAB и Shift-TAB:</para>
<para>Помните, что все функции событий являются виртуальными и защищёнными. Вы можете переназначить события, нужные вам, и определить свою реакцию. <classname>QWidget</classname> также содержит некоторые виртуальные методы, которые могут пригодиться в ваших программах. В любом случае, класс <classname>QWidget</classname> нужно узнать получше. </para>
<para>Помните, что все функции событий являются виртуальными и защищёнными. Вы можете переназначить события, нужные вам, и определить свою реакцию. <classname>TQWidget</classname> также содержит некоторые виртуальные методы, которые могут пригодиться в ваших программах. В любом случае, класс <classname>TQWidget</classname> нужно узнать получше. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Взаимодействие объектов через сигналы и слоты</title>
<title>Взаимодействие объектов через сигналы и слоты</title>
<para>Теперь переходим к основному отличию Qt: механизму сигнал/слот. Это быстрое и удобное решение реализации взаимодействия объектов, которое обычно решается посредством callback-функций в библиотеках, работающих с X-Window. Так как такое взаимодействие требует аккуратного программирования и иногда делает создание пользовательского интерфейса очень сложным (что описано в документации по Qt и объяснено в книге К.Дальхеймера [K.Dalheimer] 'Programming with Qt'), Troll Tech придумала новую систему, где объекты могут посылать сигналы, которые можно связывать с методами, объявленными как слоты. Программисту на C++ нужно знать только некоторые вещи о механизме: <itemizedlist>
<para>Теперь переходим к основному отличию Qt: механизму сигнал/слот. Это быстрое и удобное решение реализации взаимодействия объектов, которое обычно решается посредством callback-функций в библиотеках, работающих с X-Window. Так как такое взаимодействие требует аккуратного программирования и иногда делает создание пользовательского интерфейса очень сложным (что описано в документации по Qt и объяснено в книге К.Дальхеймера [K.Dalheimer] 'Programming with Qt'), Troll Tech придумала новую систему, где объекты могут посылать сигналы, которые можно связывать с методами, объявленными как слоты. Программисту на C++ нужно знать только некоторые вещи о механизме: <itemizedlist>
<listitem><para>объявление класса, использующего сигналы/слот должно содержать макрос TQ_OBJECT в начале (без точки с запятой); и должно быть унаследовано от класса <classname>QObject</classname> </para></listitem>
<listitem><para>объявление класса, использующего сигналы/слот должно содержать макрос TQ_OBJECT в начале (без точки с запятой); и должно быть унаследовано от класса <classname>TQObject</classname> </para></listitem>
<listitem><para>сигнал может быть послан ключевым словом emit (например, emit signal (параметры...)) из любого метода класса, поддерживающего сигналы/слоты </para></listitem>
<listitem><para>сигнал может быть послан ключевым словом emit (например, emit signal (параметры...)) из любого метода класса, поддерживающего сигналы/слоты </para></listitem>
<listitem><para>все сигналы, использующиеся не наследуемыми классами, должны быть добавлены в объявление класса в разделе signals </para></listitem>
<listitem><para>все сигналы, использующиеся не наследуемыми классами, должны быть добавлены в объявление класса в разделе signals </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>компилятор метаобъектов (moc, meta-object compiler) обрабатывает заголовочные файлы, заменяя макросы на действительный код (это не обязательно знать). Вывод moc передаётся компилятору C++. </para></listitem>
<listitem><para>компилятор метаобъектов (moc, meta-object compiler) обрабатывает заголовочные файлы, заменяя макросы на действительный код (это не обязательно знать). Вывод moc передаётся компилятору C++. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Другой способ использования сигналов без наследования от класса <classname>QObject</classname> - использовать класс <classname>QSignal</classname>: дополнительные сведения и примеры использования вы можете найти в документации. Далее подразумевается, что вы используете наследование от класса <classname>QObject</classname>. </para>
<para>Другой способ использования сигналов без наследования от класса <classname>TQObject</classname> - использовать класс <classname>QSignal</classname>: дополнительные сведения и примеры использования вы можете найти в документации. Далее подразумевается, что вы используете наследование от класса <classname>TQObject</classname>. </para>
<para>В этом случае ваш класс может посылать сигналы куда угодно и создавать слоты, к которым можно привязывать любые сигналы. Используя сигналы, вам не нужно заботиться о том, кто их получает - нужно просто послать сигнал, а потом подключить любой слот, который будет выполнен при возникновении сигнала. Слоты можно использовать также как обычные методы в реализации. </para>
<para>В этом случае ваш класс может посылать сигналы куда угодно и создавать слоты, к которым можно привязывать любые сигналы. Используя сигналы, вам не нужно заботиться о том, кто их получает - нужно просто послать сигнал, а потом подключить любой слот, который будет выполнен при возникновении сигнала. Слоты можно использовать также как обычные методы в реализации. </para>
<para>Теперь, чтобы соединить сигнал со слотом,воспользуйтесь методом <methodname>connect()</methodname> класса <classname>QObject</classname> или, если доступно, другими специальными методами объекта для создания привязки к соответствующему сигналу. </para>
<para>Теперь, чтобы соединить сигнал со слотом,воспользуйтесь методом <methodname>connect()</methodname> класса <classname>TQObject</classname> или, если доступно, другими специальными методами объекта для создания привязки к соответствующему сигналу. </para>
<para>Как видите, мы лишь расширили возможности кнопки с использованием метода <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname> — всё, что мы добавили. Что же это означает? Объявление метода <methodname>connect()</methodname> в классе QObject: </para>
<para>Как видите, мы лишь расширили возможности кнопки с использованием метода <methodname>connect()</methodname>: <methodname>connect(&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname> — всё, что мы добавили. Что же это означает? Объявление метода <methodname>connect()</methodname> в классе TQObject: </para>
<para>Это значит, что указатель на экземпляр <classname>QObject</classname> является инициатором сигнала, указанного во втором аргументе. Оставшиеся два аргумента есть объект-приёмник, который имеет слот, а затем и имя функции-слота, которая будет выполнена при получении сигнала. </para>
<para>Это значит, что указатель на экземпляр <classname>TQObject</classname> является инициатором сигнала, указанного во втором аргументе. Оставшиеся два аргумента есть объект-приёмник, который имеет слот, а затем и имя функции-слота, которая будет выполнена при получении сигнала. </para>
<para>С помощью сигналов и слотов, объекты ваших программ могут взаимодействовать друг с другом без явной зависимости от типа объекта-приёмника. Далее в этом руководстве приводится более подробное описание работы механзима сигналов/слотов. Коме этого, о нём можно почитать в <ulink url="developer.kde.org/documentation/library/libraryref.html">The KDE Library Reference Guide</ulink> и <ulink url="doc.trolltech.com">Qt online reference</ulink>. </para>
<para>С помощью сигналов и слотов, объекты ваших программ могут взаимодействовать друг с другом без явной зависимости от типа объекта-приёмника. Далее в этом руководстве приводится более подробное описание работы механзима сигналов/слотов. Коме этого, о нём можно почитать в <ulink url="developer.kde.org/documentation/library/libraryref.html">The KDE Library Reference Guide</ulink> и <ulink url="doc.trolltech.com">Qt online reference</ulink>. </para>
<para>Вы видите, что мы поменяли класс <classname>QApplication</classname> на <classname>TDEApplication</classname>. Затем мы использовали метод <methodname>setTopWidget</methodname> вместо <methodname>setMainWidget()</methodname> для указания главного элемента управления для <classname>TDEApplication</classname>. Всё! Ваше первое приложение KDE готово - осталось только указать путь к заголовочным файлам KDE и скомпоновать библиотеку tdecore ключом компоновщика -ltdecore. </para>
<para>Вы видите, что мы поменяли класс <classname>QApplication</classname> на <classname>TDEApplication</classname>. Затем мы использовали метод <methodname>setTopWidget</methodname> вместо <methodname>setMainWidget()</methodname> для указания главного элемента управления для <classname>TDEApplication</classname>. Всё! Ваше первое приложение KDE готово - осталось только указать путь к заголовочным файлам KDE и скомпоновать библиотеку tdecore ключом компоновщика -ltdecore. </para>
<para>Если вы не собираетесь создавать такие простые программы, вам понадобится более удобная среда написания ПО. В следующей главе речь пойдёт о &tdevelop;. </para>
<para>Если вы не собираетесь создавать такие простые программы, вам понадобится более удобная среда написания ПО. В следующей главе речь пойдёт о &tdevelop;. </para>
<para>Итак, к этому времени, вы уже прошлись по страницам справочной документации Qt, в т.ч. по классам <classname>QApplication</classname>, <classname>QWidget</classname> и <classname>QObject</classname>, а также по документации библиотеки tdecore, классу <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE Library Reference handbook</ulink> содержит полное описание использования конструкторов <classname>QApplication</classname> и <classname>TDEApplication</classname>, включая также обработку ключей командной строки. </para>
<para>Итак, к этому времени, вы уже прошлись по страницам справочной документации Qt, в т.ч. по классам <classname>QApplication</classname>, <classname>TQWidget</classname> и <classname>TQObject</classname>, а также по документации библиотеки tdecore, классу <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE Library Reference handbook</ulink> содержит полное описание использования конструкторов <classname>QApplication</classname> и <classname>TDEApplication</classname>, включая также обработку ключей командной строки. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // allow the view to change the statusbar and caption
18 // allow the view to change the statusbar and caption
<para>Излишним будет говорить, что стабильность - самая главная цель. Никто не может 100% избежать ошибок ("bugs"), но разумное проектирование позволяет значительно уменьшить количество возможных недоработок. Программирование на C++, если вы знаете как использовать его лучшие стороны - наследовательность, скрытие информации (модульность) и повторное использование одного кода, безусловно принесёт вам успех. </para>
<para>Излишним будет говорить, что стабильность - самая главная цель. Никто не может 100% избежать ошибок ("bugs"), но разумное проектирование позволяет значительно уменьшить количество возможных недоработок. Программирование на C++, если вы знаете как использовать его лучшие стороны - наследовательность, скрытие информации (модульность) и повторное использование одного кода, безусловно принесёт вам успех. </para>
<para>При создании проекта KDE или Qt, его представление (view) всегда наследует QWidget, либо напрямую, либо через другие элементы управления библиотек. Мастер приложений также создёт код, содержащий класс yourappView, наследователь QWidget. </para>
<para>При создании проекта KDE или Qt, его представление (view) всегда наследует TQWidget, либо напрямую, либо через другие элементы управления библиотек. Мастер приложений также создёт код, содержащий класс yourappView, наследователь TQWidget. </para>
<para>В этой главе мы опишем как использовать элементы управления библиотек для создания новыхпредставлений, потом будет обзор готовых представлений, которые они уже содержат. </para>
<para>В этой главе мы опишем как использовать элементы управления библиотек для создания новыхпредставлений, потом будет обзор готовых представлений, которые они уже содержат. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>На первой странице документации Qt вы можете найти ссылку на "Widget Screenshots", чтобы выбрать нужный. Они уже готовы к использованию, и их можно совмещать. Далее, мы обсудим некоторые из них, но помните, что библиотеки KDE могут содержать свои (доработанные) элементы управления, предназначенные для тех же задач. </para>
<para>На первой странице документации Qt вы можете найти ссылку на "Widget Screenshots", чтобы выбрать нужный. Они уже готовы к использованию, и их можно совмещать. Далее, мы обсудим некоторые из них, но помните, что библиотеки KDE могут содержать свои (доработанные) элементы управления, предназначенные для тех же задач. </para>
<para>Вот несколько компонентов Qt и их назначения: <orderedlist>
<para>Вот несколько компонентов Qt и их назначения: <orderedlist>
<listitem><para>Если в области вашего представления не хватает свободного места, пользователь должен перемещаться по документу с помощью полос прокрутки. Для этого, в Qt есть класс <classname>QScrollView</classname>. Вы можете сделать свой элемент управления наследником <classname>QScrollView</classname> или использовать его экземпляр для управления представлением. </para></listitem>
<listitem><para>Если в области вашего представления не хватает свободного места, пользователь должен перемещаться по документу с помощью полос прокрутки. Для этого, в Qt есть класс <classname>QScrollView</classname>. Вы можете сделать свой элемент управления наследником <classname>QScrollView</classname> или использовать его экземпляр для управления представлением. </para></listitem>
<listitem><para>Для создания ScrollView, унаследуйте виджет-представление от <classname>QWidget</classname> и и добавьте вертикальные и горизонтальные полосы прокрутки <classname>QScrollBars </classname> (так делается в TDEHTMLView). </para></listitem>
<listitem><para>Для создания ScrollView, унаследуйте виджет-представление от <classname>TQWidget</classname> и и добавьте вертикальные и горизонтальные полосы прокрутки <classname>QScrollBars </classname> (так делается в TDEHTMLView). </para></listitem>
<listitem><para>Для обработки текста, пвоспользуйтесь <classname>QTextEdit</classname>. Этот класс предоставляет законченный виджет текстового редактора, который уже поддерживает операции с буфером обмена, а также управляется полосами прокрутки scrollview. </para></listitem>
<listitem><para>Для обработки текста, пвоспользуйтесь <classname>QTextEdit</classname>. Этот класс предоставляет законченный виджет текстового редактора, который уже поддерживает операции с буфером обмена, а также управляется полосами прокрутки scrollview. </para></listitem>
<listitem><para>Воспользуйтесь <classname>QTable</classname> для отображения данных, организованных в таблицу. <classname>QTable</classname> также управляется полосами прокрутки. </para></listitem>
<listitem><para>Воспользуйтесь <classname>QTable</classname> для отображения данных, организованных в таблицу. <classname>QTable</classname> также управляется полосами прокрутки. </para></listitem>
<listitem><para>Для отображения двух различных виджетов или двух экземпляров одного виджета одновременно, воспользуйтесь <classname>QSplitter </classname>. Он позволяет разделить представления горизонтально или вертикально. Его использует KMail и KBabel. </para></listitem>
<listitem><para>Для отображения двух различных виджетов или двух экземпляров одного виджета одновременно, воспользуйтесь <classname>QSplitter </classname>. Он позволяет разделить представления горизонтально или вертикально. Его использует KMail и KBabel. </para></listitem>
<para>Подсказка <guibutton>Что это?</guibutton> должна содержать кратку справку (абзац-два) по выбраному элементу. Сама кнопка <guibutton>Что это?</guibutton> обычно располагается либо в меню, либо на панели инструментов, либо в загаловке окна. После нажатия на ней, пользователь должен нажать на нужной объекте. </para>
<para>Подсказка <guibutton>Что это?</guibutton> должна содержать кратку справку (абзац-два) по выбраному элементу. Сама кнопка <guibutton>Что это?</guibutton> обычно располагается либо в меню, либо на панели инструментов, либо в загаловке окна. После нажатия на ней, пользователь должен нажать на нужной объекте. </para>
<para>Для добавления такой справки, воспользуйтесь статическим методом <methodname>QWhatsThis::add(QWidget *widget, const QString &text)</methodname> </para>
<para>Для добавления такой справки, воспользуйтесь статическим методом <methodname>QWhatsThis::add(TQWidget *widget, const TQString &text)</methodname> </para>
<para>Низкоуровневая графическая модель Qt основывается на возможностях, предоставляемых X11 или другими графическими моделями, в которые портирована Qt. Но в ней также есть расширенные функции, такие как произвольные преобразования для текста и растра. </para>
<para>Низкоуровневая графическая модель Qt основывается на возможностях, предоставляемых X11 или другими графическими моделями, в которые портирована Qt. Но в ней также есть расширенные функции, такие как произвольные преобразования для текста и растра. </para>
<para>Центральный графический класс для двухмерного рисования с Qt называется <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Он может рисовать на <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Реализовано 3 устройства для рисования: <ulink url="kdeapi:qt/QWidget">QWidget</ulink>, представляющий элемент управления на экране, <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, представляющий виджет в виде вывода Postscript, и <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, позволяющий записывать и воспроизводить команды рисования (с диска) в формате SVG. </para>
<para>Центральный графический класс для двухмерного рисования с Qt называется <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Он может рисовать на <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Реализовано 3 устройства для рисования: <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink>, представляющий элемент управления на экране, <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, представляющий виджет в виде вывода Postscript, и <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, позволяющий записывать и воспроизводить команды рисования (с диска) в формате SVG. </para>
<para>Такое рисование используется преимущественно в методе paintEvent() класса элемента управления. </para>
<para>Такое рисование используется преимущественно в методе paintEvent() класса элемента управления. </para>
<para>В Qt цвета представлены классом <ulink url="kdeapi:qt/QColor">QColor</ulink>. Qt не поддерживает расширенную функциональность типа цветовых профилей ICC и сглаживание цветов. Цвета указываются по RGB. </para>
<para>В Qt цвета представлены классом <ulink url="kdeapi:qt/TQColor">TQColor</ulink>. Qt не поддерживает расширенную функциональность типа цветовых профилей ICC и сглаживание цветов. Цвета указываются по RGB. </para>
<para>Также возможно использовать оттенки, насыщенность и величина (HSV). Эти параметры напрямую используются в диалоге выбора цвета GIMP. Оттенок отвечает уголку на полосе цвета, насыщенность отвечает расстоянию до центра окружности. Величину можно выбрать отдельным ползунком. </para>
<para>Также возможно использовать оттенки, насыщенность и величина (HSV). Эти параметры напрямую используются в диалоге выбора цвета GIMP. Оттенок отвечает уголку на полосе цвета, насыщенность отвечает расстоянию до центра окружности. Величину можно выбрать отдельным ползунком. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> отвечает растровым объектам X11. Растры - это объекты стороны сервера и могут - на новых графических картах - даже храниться в их памяти. Поэтому работа с ними происходит <emphasis>очень</emphasis> быстро. Растры также выступают эквивалентами элементов управления - класс QPixmap является подклассом QPaintDevice, так что вы можете рисовать на нём с QPainter. Элементарные операции рисования обычно оптимизируются современными графическими картами. Поэтому, можно использовать растры для двойной буферизации ("double buffering"). Это означает рисовать не прямо на элементе управления, а на временном растре, а потом вызывать функцию <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> чтобы передать его виджету. Для сложных перерисовок, это помогает предотвратить мигание. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> отвечает растровым объектам X11. Растры - это объекты стороны сервера и могут - на новых графических картах - даже храниться в их памяти. Поэтому работа с ними происходит <emphasis>очень</emphasis> быстро. Растры также выступают эквивалентами элементов управления - класс QPixmap является подклассом QPaintDevice, так что вы можете рисовать на нём с QPainter. Элементарные операции рисования обычно оптимизируются современными графическими картами. Поэтому, можно использовать растры для двойной буферизации ("double buffering"). Это означает рисовать не прямо на элементе управления, а на временном растре, а потом вызывать функцию <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> чтобы передать его виджету. Для сложных перерисовок, это помогает предотвратить мигание. </para>
<para>Объекты <ulink url="kdeapi:qt/QImage">QImage</ulink> располагаются на стороне клиента. Основное ударение поставлено на прямой доступ к точкам изображения. Это упрощает операции манипуляции с изображениями, загрузку и сохранение на диск (метод QPixmapload() берёт QImage как промежуточный). С другой стороны, рисование на элементе управления - дорогая операция, т.к. включает в себя передачу X-серверу. В зависимости от глубины цвета, преобразование из QImage в QPixmap может требовать dithering. </para>
<para>Объекты <ulink url="kdeapi:qt/TQImage">TQImage</ulink> располагаются на стороне клиента. Основное ударение поставлено на прямой доступ к точкам изображения. Это упрощает операции манипуляции с изображениями, загрузку и сохранение на диск (метод QPixmapload() берёт TQImage как промежуточный). С другой стороны, рисование на элементе управления - дорогая операция, т.к. включает в себя передачу X-серверу. В зависимости от глубины цвета, преобразование из TQImage в QPixmap может требовать dithering. </para>
<para>Кроме обычных записей, здесь есть объявление наличия свойств. Каждое определение свойства отвечает группе <literal>[PropertyDef::name]</literal> в файле настроек. В этой группе, <literal>Type</literal> объявляет тип свойства. Возможные типы - всё, что может храниться в <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Кроме обычных записей, здесь есть объявление наличия свойств. Каждое определение свойства отвечает группе <literal>[PropertyDef::name]</literal> в файле настроек. В этой группе, <literal>Type</literal> объявляет тип свойства. Возможные типы - всё, что может храниться в <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Получив объект <classname>KService</classname>, остаётся загрузить библиотеку и получить указатель на объект factory: </para>
<para>Получив объект <classname>KService</classname>, остаётся загрузить библиотеку и получить указатель на объект factory: </para>
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>В пиведенном примере, служба была запущена по имени ("by name"), т.е. первым аргументом <function>TDEApplication::startServiceByName()</function> является имя, указываемое в записи <literal>Name</literal> файла .desktop. Как альтернативу, можно использовать <function>TDEApplication::startServiceByDesktopName()</function>, которому передаётся имя файла .desktop, например <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>В пиведенном примере, служба была запущена по имени ("by name"), т.е. первым аргументом <function>TDEApplication::startServiceByName()</function> является имя, указываемое в записи <literal>Name</literal> файла .desktop. Как альтернативу, можно использовать <function>TDEApplication::startServiceByDesktopName()</function>, которому передаётся имя файла .desktop, например <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Все эти вызовы берут список URL вторым аргументом. Третий аргумент - указатель на <classname>QString</classname>. Если произойдёт ошибка, в это строку будет занесено (локализованное) сообщение об ошибке. </para>
<para>Все эти вызовы берут список URL вторым аргументом. Третий аргумент - указатель на <classname>TQString</classname>. Если произойдёт ошибка, в это строку будет занесено (локализованное) сообщение об ошибке. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>KMimeMagic поддерживает только локальные файлы. Для удалённых файлов: </para>
<para>KMimeMagic поддерживает только локальные файлы. Для удалённых файлов: </para>
<para>Niektoré podmienky obsahujú vzorky, ktorým majú zodpovedať, ale nájdený text sa nestane súčasťou výsledku celého výrazu.</para>
<para>Niektoré podmienky obsahujú vzorky, ktorým majú zodpovedať, ale nájdený text sa nestane súčasťou výsledku celého výrazu.</para>
<para>Regulárne výrazy, ktoré tu popisujeme, podporujú tieto podmienky: <variablelist> <varlistentry> <term><userinput>^</userinput> (začiatok reťazca)</term> <listitem><para>Zodpovedá začiatku prehľadávaného reťazca.</para> <para>Výraz <userinput>^Peter</userinput> bude zodpovedať <quote>Peter</quote> v reťazci <quote>Peter, hey!</quote>, ale nie v <quote>Hey, Peter!</quote> </para> </listitem> </varlistentry> <varlistentry> <term><userinput>$</userinput> (koniec reťazca)</term> <listitem><para>Zodpovedá koncu prehľadávaného reťazca.</para> <para>Výraz <userinput>you\?$</userinput> nájde posledné you v reťazci <quote>You didn't do that, did you?</quote> ale žiadne v <quote>You didn't do that, right?</quote></para> </listitem> </varlistentry> <varlistentry> <term><userinput>\b</userinput> (okraj slova)</term> <listitem><para>Platí, ak je na jednej strane znak slova, ale na druhej nie.</para> <para>To sa hodí pre nájdenie koncov slov, napríklad na oboch koncoch slova musí platiť. Výraz <userinput>\bin\b</userinput> nájde samostatné <quote>in</quote> v reťazci <quote>He came in through the window</quote>, ale nie <quote>in</quote> v slove <quote>window</quote>.</para></listitem> </varlistentry> <varlistentry> <term><userinput>\B</userinput> (nie okraj slova)</term> <listitem><para>Platí, ak neplatí <quote>\b</quote>.</para> <para>To znamená, že bude napríklad zodpovedať v slovách: Výraz <userinput>\Bin\B</userinput> bude nájdený v <quote>window</quote> ale nie v <quote>integer</quote> alebo <quote>I'm in love</quote>.</para> </listitem> </varlistentry> <varlistentry> <term><userinput>(?=VZORKA)</userinput> (Pozitívny výhľad)</term> <listitem><para>Podmienka výhľadu sa pozrie na reťazec, ktorý nasleduje za možným výskytom. Pozitívny výhľad zabráni, aby sa našiel text, ktorý by nezodpovedal <emphasis>VZORKA</emphasis>, ale text, ktorý vzorke zodpovedá, sa vo výsledku neobjaví.</para> <para>Výraz <userinput>auto(?=\w)</userinput> zodpovedá <quote>auto</quote> v <quote>autobus</quote> ale nie v <quote>To auto je pokazené.</quote></para> </listitem> </varlistentry> <varlistentry> <term><userinput>(?!VZORKA)</userinput> (Negatívny výhľad)</term> <listitem><para>Negatívny výhľad zabráni nájdeniu textu v prípade, že nasledujúci text nezodpovedá <emphasis>VZORKA</emphasis></para> <para>Výraz <userinput>const \w+\b(?!\s*&)</userinput> bude zodpovedať na <quote>const char</quote> v reťazci <quote>const char* foo</quote> ale nie <quote>const QString</quote> v <quote>const QString& bar</quote>, pretože <quote>&</quote> zodpovedá vzorke negatívneho výhľadu.</para> </listitem> </varlistentry> </variablelist> </para>
<para>Regulárne výrazy, ktoré tu popisujeme, podporujú tieto podmienky: <variablelist> <varlistentry> <term><userinput>^</userinput> (začiatok reťazca)</term> <listitem><para>Zodpovedá začiatku prehľadávaného reťazca.</para> <para>Výraz <userinput>^Peter</userinput> bude zodpovedať <quote>Peter</quote> v reťazci <quote>Peter, hey!</quote>, ale nie v <quote>Hey, Peter!</quote> </para> </listitem> </varlistentry> <varlistentry> <term><userinput>$</userinput> (koniec reťazca)</term> <listitem><para>Zodpovedá koncu prehľadávaného reťazca.</para> <para>Výraz <userinput>you\?$</userinput> nájde posledné you v reťazci <quote>You didn't do that, did you?</quote> ale žiadne v <quote>You didn't do that, right?</quote></para> </listitem> </varlistentry> <varlistentry> <term><userinput>\b</userinput> (okraj slova)</term> <listitem><para>Platí, ak je na jednej strane znak slova, ale na druhej nie.</para> <para>To sa hodí pre nájdenie koncov slov, napríklad na oboch koncoch slova musí platiť. Výraz <userinput>\bin\b</userinput> nájde samostatné <quote>in</quote> v reťazci <quote>He came in through the window</quote>, ale nie <quote>in</quote> v slove <quote>window</quote>.</para></listitem> </varlistentry> <varlistentry> <term><userinput>\B</userinput> (nie okraj slova)</term> <listitem><para>Platí, ak neplatí <quote>\b</quote>.</para> <para>To znamená, že bude napríklad zodpovedať v slovách: Výraz <userinput>\Bin\B</userinput> bude nájdený v <quote>window</quote> ale nie v <quote>integer</quote> alebo <quote>I'm in love</quote>.</para> </listitem> </varlistentry> <varlistentry> <term><userinput>(?=VZORKA)</userinput> (Pozitívny výhľad)</term> <listitem><para>Podmienka výhľadu sa pozrie na reťazec, ktorý nasleduje za možným výskytom. Pozitívny výhľad zabráni, aby sa našiel text, ktorý by nezodpovedal <emphasis>VZORKA</emphasis>, ale text, ktorý vzorke zodpovedá, sa vo výsledku neobjaví.</para> <para>Výraz <userinput>auto(?=\w)</userinput> zodpovedá <quote>auto</quote> v <quote>autobus</quote> ale nie v <quote>To auto je pokazené.</quote></para> </listitem> </varlistentry> <varlistentry> <term><userinput>(?!VZORKA)</userinput> (Negatívny výhľad)</term> <listitem><para>Negatívny výhľad zabráni nájdeniu textu v prípade, že nasledujúci text nezodpovedá <emphasis>VZORKA</emphasis></para> <para>Výraz <userinput>const \w+\b(?!\s*&)</userinput> bude zodpovedať na <quote>const char</quote> v reťazci <quote>const char* foo</quote> ale nie <quote>const TQString</quote> v <quote>const TQString& bar</quote>, pretože <quote>&</quote> zodpovedá vzorke negatívneho výhľadu.</para> </listitem> </varlistentry> </variablelist> </para>
<listitem><para>Den negativa sökningen framåt förhindrar en möjlig matchning från att bekräftas om den följande delen av söksträngen matchar sitt <emphasis>MÖNSTER</emphasis>.</para>
<listitem><para>Den negativa sökningen framåt förhindrar en möjlig matchning från att bekräftas om den följande delen av söksträngen matchar sitt <emphasis>MÖNSTER</emphasis>.</para>
<para>Uttrycket <userinput>const \w+\b(?!\s*&)</userinput> matchar vid <quote>const char</quote> i strängen <quote>const char* x</quote> medan den inte kan matcha <quote>const QString</quote> i <quote>const QString& y</quote> eftersom <quote>&</quote> matchar mönstret i den negativa sökningen framåt.</para>
<para>Uttrycket <userinput>const \w+\b(?!\s*&)</userinput> matchar vid <quote>const char</quote> i strängen <quote>const char* x</quote> medan den inte kan matcha <quote>const TQString</quote> i <quote>const TQString& y</quote> eftersom <quote>&</quote> matchar mönstret i den negativa sökningen framåt.</para>
<para>Innan ditt program börjar sitt beräkningsintensiva arbete, eller innan det börjar ladda insticksprogram, etc. starta &ksplash; enligt följande:</para>
<para>Innan ditt program börjar sitt beräkningsintensiva arbete, eller innan det börjar ladda insticksprogram, etc. starta &ksplash; enligt följande:</para>
<listitem><para>Insticksmodulklasser måste tillhandahålla en <literal>statisk</literal> funktion som heter <function>names</function>, som returnerar en lista med namn som de kan anropas med.</para></listitem>
<listitem><para>Insticksmodulklasser måste tillhandahålla en <literal>statisk</literal> funktion som heter <function>names</function>, som returnerar en lista med namn som de kan anropas med.</para></listitem>
<listitem><para>Om insticksmodulen kan anpassas i inställningscentralens modul, ska den tillhandahålla en klass baserad på <literal>ThemeEngineConfig</literal> för inställningarna.</para></listitem>
<listitem><para>Om insticksmodulen kan anpassas i inställningscentralens modul, ska den tillhandahålla en klass baserad på <literal>ThemeEngineConfig</literal> för inställningarna.</para></listitem>
<listitem><para>Insticksmodulklasser måste måste överskrida minst en av de virtuella funktionerna <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> eller <function>slotUpdateSteps</function> för att vara användbara.</para></listitem>
<listitem><para>Insticksmodulklasser måste måste överskrida minst en av de virtuella funktionerna <function>slotSetText</function>, <function>slotSetPixmap</function>, <function>slotUpdateProgress</function> eller <function>slotUpdateSteps</function> för att vara användbara.</para></listitem>
<listitem><para>Konstruktorn måste vara på formen <literal>ThemeEngine( QWidget *parent, const char *name, const QStringList &args )</literal> så att den kan användas med <classname>KGenericFactory</classname>.</para></listitem>
<listitem><para>Konstruktorn måste vara på formen <literal>ThemeEngine( TQWidget *parent, const char *name, const QStringList &args )</literal> så att den kan användas med <classname>KGenericFactory</classname>.</para></listitem>
</orderedlist>
</orderedlist>
<para>Det sista kravet kan verka komplicerat, men som vi senare kommer att se, kan du ofta ignorera det genom att lägga till en enda rad i dina källkodsfiler.</para>
<para>Det sista kravet kan verka komplicerat, men som vi senare kommer att se, kan du ofta ignorera det genom att lägga till en enda rad i dina källkodsfiler.</para>
</sect1>
</sect1>
@ -633,11 +633,11 @@ class Theme2k: public ThemeEngine
<para>Låt oss analysera listningen ovan. Klassen <classname>Theme2k</classname> följer namngivningskonventionen, och ärver från <classname>ThemeEngine</classname>. Den tillhandahåller metoden <methodname>Theme2k::names()</methodname>, och har en konstruktor som använder parametrar som krävs: <function>Theme2k( QWidget *, const char *, const QStringList& );</function> och tillhandahåller också en enkel metod vid namn <methodname>Theme2k::slotSetText()</methodname>. Bekymra dig för närvarande inte om klassen <classname>RotWidget</classname>. Det är en liten grafisk komponentklass som tillhandahåller lite ögongodis åt användaren. Vår insticksmodul är mycket enkel, och visar inte några ikoner eller en förloppsrad. Om du vill visa ikoner, överskrid funktionen <function>slotSetPixmap</function>. Liknande funktioner finns för att ställa in förloppsradens hastighet (<function>slotUpdateSteps</function>) och öka nuvarande steg (<function>slotUpdateProgress</function>). </para>
<para>Låt oss analysera listningen ovan. Klassen <classname>Theme2k</classname> följer namngivningskonventionen, och ärver från <classname>ThemeEngine</classname>. Den tillhandahåller metoden <methodname>Theme2k::names()</methodname>, och har en konstruktor som använder parametrar som krävs: <function>Theme2k( TQWidget *, const char *, const QStringList& );</function> och tillhandahåller också en enkel metod vid namn <methodname>Theme2k::slotSetText()</methodname>. Bekymra dig för närvarande inte om klassen <classname>RotWidget</classname>. Det är en liten grafisk komponentklass som tillhandahåller lite ögongodis åt användaren. Vår insticksmodul är mycket enkel, och visar inte några ikoner eller en förloppsrad. Om du vill visa ikoner, överskrid funktionen <function>slotSetPixmap</function>. Liknande funktioner finns för att ställa in förloppsradens hastighet (<function>slotUpdateSteps</function>) och öka nuvarande steg (<function>slotUpdateProgress</function>). </para>
</sect1>
</sect1>
<sect1 id="Implementation">
<sect1 id="Implementation">
<title>Implementering av insticksmodulen</title>
<title>Implementering av insticksmodulen</title>
@ -686,7 +686,7 @@ private:
<para>Makrot <constant>K_EXPORT_COMPONENT_FACTORY</constant> deklareras i <filename>kgenericfactory.h</filename>. Låt oss fortsätta till konstruktorn! Eftersom det här är en mycket enkel insticksmodul, är konstruktorn ganska rättfram.</para>
<para>Makrot <constant>K_EXPORT_COMPONENT_FACTORY</constant> deklareras i <filename>kgenericfactory.h</filename>. Låt oss fortsätta till konstruktorn! Eftersom det här är en mycket enkel insticksmodul, är konstruktorn ganska rättfram.</para>
<para>&kstars; <abbrev>DCOP</abbrev>-gränssnitt omfattar följande funktioner: <itemizedlist>
<para>&kstars; <abbrev>DCOP</abbrev>-gränssnitt omfattar följande funktioner: <itemizedlist>
<listitem><para><function> lookTowards( const QString riktning )</function>: Peka skärmens fokus i en riktning som anges av argumentet. Det här kan vara namnet på vilket objekt som helst på himlen, eller något av följande riktningsord eller förkortningar: zenith (eller z, för zenit), north (n, för norr), northeast (ne, för nordöst), east (e, för öst), southeast (se, för sydöst), south (s, för söder), southwest (sw, för sydväst), west (w, för väster), northwest (nw, för nordväst). </para></listitem>
<listitem><para><function> lookTowards( const TQString riktning )</function>: Peka skärmens fokus i en riktning som anges av argumentet. Det här kan vara namnet på vilket objekt som helst på himlen, eller något av följande riktningsord eller förkortningar: zenith (eller z, för zenit), north (n, för norr), northeast (ne, för nordöst), east (e, för öst), southeast (se, för sydöst), south (s, för söder), southwest (sw, för sydväst), west (w, för väster), northwest (nw, för nordväst). </para></listitem>
<listitem><para><function> setRaDec( double ra, double dek )</function>: Peka skärmens fokus på de angivna ekvatoriella koordinaterna. </para></listitem>
<listitem><para><function> setRaDec( double ra, double dek )</function>: Peka skärmens fokus på de angivna ekvatoriella koordinaterna. </para></listitem>
@ -22,13 +22,13 @@
<listitem><para><function> waitFor( double t )</function>: Gör paus under t sekunder innan följande skriptkommandon behandlas. </para></listitem>
<listitem><para><function> waitFor( double t )</function>: Gör paus under t sekunder innan följande skriptkommandon behandlas. </para></listitem>
<listitem><para><function> waitForKey( const QString k )</function>: Stanna körning av skriptet till användaren trycker på den angivna tangenten. För närvarande kan du inte ange tangentkombinationer (som <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>). Använd bara enkla tangenter. Du kan skriva <quote>space</quote> för att ange mellanslag. </para></listitem>
<listitem><para><function> waitForKey( const TQString k )</function>: Stanna körning av skriptet till användaren trycker på den angivna tangenten. För närvarande kan du inte ange tangentkombinationer (som <keycombo action="simul">&Ctrl;<keycap>C</keycap></keycombo>). Använd bara enkla tangenter. Du kan skriva <quote>space</quote> för att ange mellanslag. </para></listitem>
<listitem><para><function> setTracking( bool följ )</function>: Välj om följningsläge är aktivt eller inte. </para></listitem>
<listitem><para><function> setTracking( bool följ )</function>: Välj om följningsläge är aktivt eller inte. </para></listitem>
<listitem><para><function> changeViewOption( const QString alternativ, const QString värde )</function>: Ändra ett visningsalternativ. Det finns många dussin alternativ tillgängliga. I stort sett allting som du kan ändra i fönstret <guilabel>Anpassa &kstars;</guilabel> kan också ändras här. Det första argumentet är alternativets namn (namnen kommer från inställningsfilen <filename>kstarsrc</filename>), och det andra argumentet är önskat värde. Argumenttolken är konstruerad för att vara robust, så om du av misstag skickar in felaktig data bör den misslyckas utan allvarliga konsekvenser. </para></listitem>
<listitem><para><function> changeViewOption( const TQString alternativ, const TQString värde )</function>: Ändra ett visningsalternativ. Det finns många dussin alternativ tillgängliga. I stort sett allting som du kan ändra i fönstret <guilabel>Anpassa &kstars;</guilabel> kan också ändras här. Det första argumentet är alternativets namn (namnen kommer från inställningsfilen <filename>kstarsrc</filename>), och det andra argumentet är önskat värde. Argumenttolken är konstruerad för att vara robust, så om du av misstag skickar in felaktig data bör den misslyckas utan allvarliga konsekvenser. </para></listitem>
<listitem><para><function> setGeoLocation( const QString stad, const QString område, const QString land )</function>: Ändra observationsplats till den angivna staden. Om ingen stad passar ihop med argumentsträngarna, händer ingenting. </para></listitem>
<listitem><para><function> setGeoLocation( const TQString stad, const TQString område, const TQString land )</function>: Ändra observationsplats till den angivna staden. Om ingen stad passar ihop med argumentsträngarna, händer ingenting. </para></listitem>
<listitem><para>Generella enhetsfunktioner: Funktioner för att upprätta eller stänga av enheter, etc.</para>
<listitem><para>Generella enhetsfunktioner: Funktioner för att upprätta eller stänga av enheter, etc.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>startINDI (QString deviceName, bool useLocal)</function>: Upprätta en INDI-enhet antingen i lokalläge eller serverläge.</para></listitem>
<listitem><para><function>startINDI (TQString deviceName, bool useLocal)</function>: Upprätta en INDI-enhet antingen i lokalläge eller serverläge.</para></listitem>
<listitem><para><function>shutdownINDI (QString deviceName)</function>: Stäng av en INDI-enhet.</para></listitem>
<listitem><para><function>shutdownINDI (TQString deviceName)</function>: Stäng av en INDI-enhet.</para></listitem>
<listitem><para><function>switchINDI(QString deviceName, bool turnOn)</function>: Koppla upp eller koppla ner en INDI-enhet.</para></listitem>
<listitem><para><function>switchINDI(TQString deviceName, bool turnOn)</function>: Koppla upp eller koppla ner en INDI-enhet.</para></listitem>
<listitem><para><function>setINDIPort(QString deviceName, QString port)</function>: Ställ in INDI-enhetens anslutningsport.</para></listitem>
<listitem><para><function>setINDIPort(TQString deviceName, TQString port)</function>: Ställ in INDI-enhetens anslutningsport.</para></listitem>
<listitem><para><function>setINDIAction(QString deviceName, QString action)</function>: Aktivera en INDI-åtgärd. Åtgärden kan vara vilket <emphasis>element</emphasis> som helst i en <emphasis>omställningsegenskap</emphasis>.</para></listitem>
<listitem><para><function>setINDIAction(TQString deviceName, TQString action)</function>: Aktivera en INDI-åtgärd. Åtgärden kan vara vilket <emphasis>element</emphasis> som helst i en <emphasis>omställningsegenskap</emphasis>.</para></listitem>
<listitem><para><function>waitForINDIAction(QString deviceName, QString action)</function>: Gör paus i körning av skriptet till angiven <emphasis>åtgärdsegenskap</emphasis> returnerar med status Ok.</para></listitem>
<listitem><para><function>waitForINDIAction(TQString deviceName, TQString action)</function>: Gör paus i körning av skriptet till angiven <emphasis>åtgärdsegenskap</emphasis> returnerar med status Ok.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Teleskopfunktioner: Funktioner för att styra teleskoprörelser och status.</para>
<listitem><para>Teleskopfunktioner: Funktioner för att styra teleskoprörelser och status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIScopeAction(QString deviceName, QString action)</function>: Ställ in teleskopets läge eller åtgärd. Tillgängliga alternativ är SLEW, TRACK, SYNC, PARK och ABORT.</para></listitem>
<listitem><para><function>setINDIScopeAction(TQString deviceName, TQString action)</function>: Ställ in teleskopets läge eller åtgärd. Tillgängliga alternativ är SLEW, TRACK, SYNC, PARK och ABORT.</para></listitem>
<listitem><para><function>setINDITargetCoord(QString deviceName, double RA, double DEC)</function>: Ställ in teleskopets JNow-målkoordinater till <emphasis>RA</emphasis> och <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetCoord(TQString deviceName, double RA, double DEC)</function>: Ställ in teleskopets JNow-målkoordinater till <emphasis>RA</emphasis> och <emphasis>DEC</emphasis>.</para></listitem>
<listitem><para><function>setINDITargetName(QString deviceName, QString objectName)</function>: Ställ in teleskopets JNow-målkoordinater till koordinaterna för <emphasis>objectName</emphasis>. Kstars slår upp objektnamnet i sin databas och hämtar RA och DEC när de har hittats.</para></listitem>
<listitem><para><function>setINDITargetName(TQString deviceName, TQString objectName)</function>: Ställ in teleskopets JNow-målkoordinater till koordinaterna för <emphasis>objectName</emphasis>. Kstars slår upp objektnamnet i sin databas och hämtar RA och DEC när de har hittats.</para></listitem>
<listitem><para><function>setINDIGeoLocation(QString deviceName, double longitude, double latitude)</function>: Ställ in teleskopets geografiska plats till longitud och latitud som anges. Longituden mäts österut från Greenwich, i Storbritannien. Även om det är vanligt att använda negativa longituder för västra halvklotet, kräver dock INDI logitudvärden mellan 0 och 360 grader. Om du har en negativ longitud, addera helt enkelt 360 grader för att få värdet som INDI förväntar sig. Till exempel har Calgary i Kanada följande koordinater i &kstars;: Longitud -114 04 58 och latitud 51 02 58. Alltså skulle INDI behöva longituden 360 - 114,083 = 245,917 grader.</para></listitem>
<listitem><para><function>setINDIGeoLocation(TQString deviceName, double longitude, double latitude)</function>: Ställ in teleskopets geografiska plats till longitud och latitud som anges. Longituden mäts österut från Greenwich, i Storbritannien. Även om det är vanligt att använda negativa longituder för västra halvklotet, kräver dock INDI logitudvärden mellan 0 och 360 grader. Om du har en negativ longitud, addera helt enkelt 360 grader för att få värdet som INDI förväntar sig. Till exempel har Calgary i Kanada följande koordinater i &kstars;: Longitud -114 04 58 och latitud 51 02 58. Alltså skulle INDI behöva longituden 360 - 114,083 = 245,917 grader.</para></listitem>
<listitem><para><function>setINDIUTC(QString ddeviceName, QString UTCDateTime)</function>: Ställ in teleskopets UTC-tid med ISO 8601-format. Formatet är ÅÅÅÅ/MM/DDTTT:MM:SS.(t.ex. 2004-07-12T22:05:32).</para></listitem>
<listitem><para><function>setINDIUTC(TQString ddeviceName, TQString UTCDateTime)</function>: Ställ in teleskopets UTC-tid med ISO 8601-format. Formatet är ÅÅÅÅ/MM/DDTTT:MM:SS.(t.ex. 2004-07-12T22:05:32).</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Kamera/CCD-funktioner: Funktioner för att styra kamera/CCD-egenskaper och status.</para>
<listitem><para>Kamera/CCD-funktioner: Funktioner för att styra kamera/CCD-egenskaper och status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDICCDTemp(QString deviceName, int temp)</function>: Ställ in CCD-kretsens måltemperatur i grader Celsius.</para></listitem>
<listitem><para><function>setINDICCDTemp(TQString deviceName, int temp)</function>: Ställ in CCD-kretsens måltemperatur i grader Celsius.</para></listitem>
<listitem><para><function>setINDIFrameType(QString deviceName, QString type)</function>: Ställ in CCD-ramtyp. Tillgängliga alternativ är FRAME_LIGHT, FRAME_BIAS, FRAME_DARK och FRAME_FLAT.</para></listitem>
<listitem><para><function>setINDIFrameType(TQString deviceName, TQString type)</function>: Ställ in CCD-ramtyp. Tillgängliga alternativ är FRAME_LIGHT, FRAME_BIAS, FRAME_DARK och FRAME_FLAT.</para></listitem>
<listitem><para><function>startINDIExposure(QString deviceName, int timeout)</function>: Starta exponering med CCD eller kamera med längden som anges av <emphasis>timeout</emphasis> i sekunder.</para></listitem>
<listitem><para><function>startINDIExposure(TQString deviceName, int timeout)</function>: Starta exponering med CCD eller kamera med längden som anges av <emphasis>timeout</emphasis> i sekunder.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Fokuseringsfunktioner: Funktioner för att styra fokuseringsenhetens rörelse och status.</para>
<listitem><para>Fokuseringsfunktioner: Funktioner för att styra fokuseringsenhetens rörelse och status.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFocusSpeed(QString deviceName, QString action)</function>: Ange fokuseringsenhetens hastighet. Tillgängliga alternativ är FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM och FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusSpeed(TQString deviceName, TQString action)</function>: Ange fokuseringsenhetens hastighet. Tillgängliga alternativ är FOCUS_HALT, FOCUS_SLOW, FOCUS_MEDIUM och FOCUS_FAST.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(QString deviceName, int timeout)</function>: Ställ in tidsgränsen i sekunder för alla följande startINDIFocus-åtgärder.</para></listitem>
<listitem><para><function>setINDIFocusTimeout(TQString deviceName, int timeout)</function>: Ställ in tidsgränsen i sekunder för alla följande startINDIFocus-åtgärder.</para></listitem>
<listitem><para><function>startINDIFocus(QString deviceName, int focusDir)</function>: Flytta antingen fokuseringsenheten inåt (focusDir = 0) eller utåt (focusDir = 1). Åtgärdens hastighet och varaktighet anges av funktionerna <function>setINDIFocusSpeed()</function> och <function>setINDIFocusTimeout()</function>.</para></listitem>
<listitem><para><function>startINDIFocus(TQString deviceName, int focusDir)</function>: Flytta antingen fokuseringsenheten inåt (focusDir = 0) eller utåt (focusDir = 1). Åtgärdens hastighet och varaktighet anges av funktionerna <function>setINDIFocusSpeed()</function> och <function>setINDIFocusTimeout()</function>.</para></listitem>
</itemizedlist>
</itemizedlist>
</listitem>
</listitem>
<listitem><para>Filterfunktioner: Funktioner för att styra filterpositioner.</para>
<listitem><para>Filterfunktioner: Funktioner för att styra filterpositioner.</para>
<itemizedlist>
<itemizedlist>
<listitem><para><function>setINDIFilterNum(QString deviceName, int filter_num)</function>: Ändra filterposition till <varname>filter_num</varname>. Användaren kan tilldela alias för filternummer i dialogrutan <guimenuitem>Anpassa INDI</guimenuitem> under menyn <guimenu>Enheter</guimenu> (t.ex. Filter 1 = Röd, Filter 2 = Grön, etc.).</para></listitem>
<listitem><para><function>setINDIFilterNum(TQString deviceName, int filter_num)</function>: Ändra filterposition till <varname>filter_num</varname>. Användaren kan tilldela alias för filternummer i dialogrutan <guimenuitem>Anpassa INDI</guimenuitem> under menyn <guimenu>Enheter</guimenu> (t.ex. Filter 1 = Röd, Filter 2 = Grön, etc.).</para></listitem>
<para>Du kan få en lista med tillgängliga &DCOP;-gränssnitt, för att använda rätt väljare, som visas i exemplet: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>Du kan få en lista med tillgängliga &DCOP;-gränssnitt, för att använda rätt väljare, som visas i exemplet: <screen width="60"><prompt>$</prompt> <command>dcop `dcopstart ksnapshot` interface</command><computeroutput>
<para>är något annorlunda än att följa en NULL-pekare. Du talade inte alls om för objektet vad det är, och nu försöker du använda det. Gissningen här är att du vill ha en ny lokal instans av ett Arts::Synth_PLAY-objekt. Du kan förstås ha velat göra något annat (som att skapa objektet någon annanstans, eller använda ett befintligt fjärrobjekt). Det är i alla fall en bekväm genväg för att skapa objekt. Att skapa ett objekt när det först används fungerar inte när du väl har tilldelat det något annat (som en null-referens). </para>
<para>är något annorlunda än att följa en NULL-pekare. Du talade inte alls om för objektet vad det är, och nu försöker du använda det. Gissningen här är att du vill ha en ny lokal instans av ett Arts::Synth_PLAY-objekt. Du kan förstås ha velat göra något annat (som att skapa objektet någon annanstans, eller använda ett befintligt fjärrobjekt). Det är i alla fall en bekväm genväg för att skapa objekt. Att skapa ett objekt när det först används fungerar inte när du väl har tilldelat det något annat (som en null-referens). </para>
<para>Den motsvarande C++ terminologin skulle vara <programlisting>
<para>Den motsvarande C++ terminologin skulle vara <programlisting>
QWidget* w;
TQWidget* w;
w->show();
w->show();
</programlisting> som naturligtvis helt enkelt ger ett segmenteringsfel i C++. Så detta är annorlunda här. Det här sättet att skapa objekt är knepigt, eftersom det inte är nödvändigt att det finns en implementering för ditt gränssnitt. </para>
</programlisting> som naturligtvis helt enkelt ger ett segmenteringsfel i C++. Så detta är annorlunda här. Det här sättet att skapa objekt är knepigt, eftersom det inte är nödvändigt att det finns en implementering för ditt gränssnitt. </para>
<para>Det finns ingen anledning att basera mellanprogram för multimedia på &Qt;. Genom att bestämma sig för det, och använda allt de där trevliga &Qt;-strömmarna och andra saker, kan det lätt leda till att mellanprogram bara blir en sak för &Qt;-(eller i själva verket bara &kde;). Jag menar att om jag någonsin ser att GNOME också använder &DCOP;, eller någonting liknande, är det förstås bevisat att jag har fel. </para>
<para>Det finns ingen anledning att basera mellanprogram för multimedia på &Qt;. Genom att bestämma sig för det, och använda allt de där trevliga &Qt;-strömmarna och andra saker, kan det lätt leda till att mellanprogram bara blir en sak för &Qt;-(eller i själva verket bara &kde;). Jag menar att om jag någonsin ser att GNOME också använder &DCOP;, eller någonting liknande, är det förstås bevisat att jag har fel. </para>
<para>Fastän jag vet att &DCOP; i grunden inte känner till de datatyper som det skickar, så att man skulle kunna använda &DCOP; utan &Qt;, se hur det används i daglig &kde;-användning: man skickar runt typer som <classname>QString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, .... De här använder &Qt;:s-serialisering. Så om någon väljer att stöda &DCOP; i ett GNOME-program, måste han antingen ange att han använder <classname>QString</classname>,... typer (även om han inte gör det), och emulera sättet som &Qt; använder för strömmar, eller så skulle han skicka runt andra sträng-, pixmap- och rect-typer, och på så sätt ändå inte kunna fungera ihop med &kde;-program. </para>
<para>Fastän jag vet att &DCOP; i grunden inte känner till de datatyper som det skickar, så att man skulle kunna använda &DCOP; utan &Qt;, se hur det används i daglig &kde;-användning: man skickar runt typer som <classname>TQString</classname>, <classname>QRect</classname>, <classname>QPixmap</classname>, <classname>QCString</classname>, .... De här använder &Qt;:s-serialisering. Så om någon väljer att stöda &DCOP; i ett GNOME-program, måste han antingen ange att han använder <classname>TQString</classname>,... typer (även om han inte gör det), och emulera sättet som &Qt; använder för strömmar, eller så skulle han skicka runt andra sträng-, pixmap- och rect-typer, och på så sätt ändå inte kunna fungera ihop med &kde;-program. </para>
<para>Nå, hur som helst var alltid &arts; avsett att fungera med eller utan &kde;, med eller utan &Qt;, med eller utan X11, och kanske till och med med eller utan &Linux; (och jag har inte ens några invändningar mot personer som anpassar det till operativsystem som inte är fria). </para>
<para>Nå, hur som helst var alltid &arts; avsett att fungera med eller utan &kde;, med eller utan &Qt;, med eller utan X11, och kanske till och med med eller utan &Linux; (och jag har inte ens några invändningar mot personer som anpassar det till operativsystem som inte är fria). </para>
@ -1897,7 +1897,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bg</parameter></term>
<term><parameter>bg</parameter></term>
<listitem>
<listitem>
<para>Anger bakgrundsfärg för att visa meddelandet. Formatet på strängen kan vara <quote>#RRGGBB</quote> (som returneras av <methodname>QColor::name()</methodname>), där RR, GG och BB är tvåsiffrors hexadecimala värden för röd, grön och blå. Alternativt kan strängen vara något av de andra format som accepteras av <methodname>QColor::setNamedColor()</methodname>, såsom ett namn från X-färgdatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Ange strängens värde som null för att välja aktuell förvald bakgrundsfärg.</para>
<para>Anger bakgrundsfärg för att visa meddelandet. Formatet på strängen kan vara <quote>#RRGGBB</quote> (som returneras av <methodname>TQColor::name()</methodname>), där RR, GG och BB är tvåsiffrors hexadecimala värden för röd, grön och blå. Alternativt kan strängen vara något av de andra format som accepteras av <methodname>TQColor::setNamedColor()</methodname>, såsom ett namn från X-färgdatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Ange strängens värde som null för att välja aktuell förvald bakgrundsfärg.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -1999,21 +1999,21 @@ continuously in the background and alarms are always enabled.</para>
@ -2066,7 +2066,7 @@ continuously in the background and alarms are always enabled.</para>
<varlistentry>
<varlistentry>
<term><parameter>bg</parameter></term>
<term><parameter>bg</parameter></term>
<listitem>
<listitem>
<para>Anger bakgrundsfärg för att visa filen. Formatet på strängen kan vara <quote>#RRGGBB</quote> (som returneras av <methodname>QColor::name()</methodname>), där RR, GG och BB är tvåsiffrors hexadecimala värden för röd, grön och blå. Alternativt kan strängen vara något av de andra format som accepteras av <methodname>QColor::setNamedColor()</methodname>, såsom ett namn från X-färgdatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Ange strängens värde som null för att välja aktuell förvald bakgrundsfärg.</para>
<para>Anger bakgrundsfärg för att visa filen. Formatet på strängen kan vara <quote>#RRGGBB</quote> (som returneras av <methodname>TQColor::name()</methodname>), där RR, GG och BB är tvåsiffrors hexadecimala värden för röd, grön och blå. Alternativt kan strängen vara något av de andra format som accepteras av <methodname>TQColor::setNamedColor()</methodname>, såsom ett namn från X-färgdatabasen (t.ex. <quote>red</quote> eller <quote>steelblue</quote>). Ange strängens värde som null för att välja aktuell förvald bakgrundsfärg.</para>
</listitem>
</listitem>
</varlistentry>
</varlistentry>
@ -2152,29 +2152,29 @@ continuously in the background and alarms are always enabled.</para>
<refpurpose>schemalägg ett nytt alarm som kör ett skalkommando.</refpurpose>
<refpurpose>schemalägg ett nytt alarm som kör ett skalkommando.</refpurpose>
<para><function>hastodo(QString taskname)</function> är ett &DCOP;-anrop som letar efter en uppgift med angivet namn. Om den hittas, returneras iCalendar-användarid som identifierar uppgiften. Om den inte hittas, returneras en tom sträng. </para>
<para><function>hastodo(TQString taskname)</function> är ett &DCOP;-anrop som letar efter en uppgift med angivet namn. Om den hittas, returneras iCalendar-användarid som identifierar uppgiften. Om den inte hittas, returneras en tom sträng. </para>
<para>Filen som söks igenom är iCalendar-filen som &karm; för närvarande har öppen. Alla uppgiftsträd söks igenom, inte bara uppgifter på översta nivån. Om mer än en uppgift har ett matchande namn, returneras den första som hittas.</para>
<para>Filen som söks igenom är iCalendar-filen som &karm; för närvarande har öppen. Alla uppgiftsträd söks igenom, inte bara uppgifter på översta nivån. Om mer än en uppgift har ett matchande namn, returneras den första som hittas.</para>
<para><function>addtodo(QString todoname)</function> är en &DCOP;-funktion som lägger till en ny uppgift på översta nivån i nuvarande lagringsobjekt. Den nya uppgiftens användarid returneras. </para>
<para><function>addtodo(TQString todoname)</function> är en &DCOP;-funktion som lägger till en ny uppgift på översta nivån i nuvarande lagringsobjekt. Den nya uppgiftens användarid returneras. </para>
<para>Det andra objektet i vårt program är tryckknappen, en instans av klassen <classname>QPushButton</classname>. Av de två konstruktorer som finns för att skapa klassen, använder vi den andra. Den tar en text, som är textinnehållet i knappen. Här är det strängen "Hello world!". Därefter anropar vi metoden <methodname>resize()</methodname> för att ändra storlek på knappen i enlighet med dess innehåll. Knappen måste bli större för att göra strängen fullständigt synlig. </para>
<para>Det andra objektet i vårt program är tryckknappen, en instans av klassen <classname>QPushButton</classname>. Av de två konstruktorer som finns för att skapa klassen, använder vi den andra. Den tar en text, som är textinnehållet i knappen. Här är det strängen "Hello world!". Därefter anropar vi metoden <methodname>resize()</methodname> för att ändra storlek på knappen i enlighet med dess innehåll. Knappen måste bli större för att göra strängen fullständigt synlig. </para>
<para>Men vad gäller för metoden <methodname>show()</methodname>? Nu märker du, att som de flesta andra grafiska komponenter, är <classname>QPushButton</classname> baserad på enkelt arv. Dokumentationen säger, ärver <classname>QButton</classname>. Följ länken till klassen <classname>QButton</classname>. Det visar många andra komponenter som ärvs av <classname>QPushButton</classname>, som vi senare använder för att förklara signal/slot-mekanismen. Hur som helst finns inte metoden <methodname>show()</methodname> listad, och därför måste den vara en metod som också tillhandahålls via arv. Klassen som <classname>QButton</classname> ärver är <classname>QWidget</classname>. Följ bara länken igen, så ser du en hel mängd metoder som klassen QWidget tillhandahåller, inklusive metoden <methodname>show()</methodname>. Nu förstår vi vad som gjordes i exemplet med knappen: <orderedlist>
<para>Men vad gäller för metoden <methodname>show()</methodname>? Nu märker du, att som de flesta andra grafiska komponenter, är <classname>QPushButton</classname> baserad på enkelt arv. Dokumentationen säger, ärver <classname>QButton</classname>. Följ länken till klassen <classname>QButton</classname>. Det visar många andra komponenter som ärvs av <classname>QPushButton</classname>, som vi senare använder för att förklara signal/slot-mekanismen. Hur som helst finns inte metoden <methodname>show()</methodname> listad, och därför måste den vara en metod som också tillhandahålls via arv. Klassen som <classname>QButton</classname> ärver är <classname>TQWidget</classname>. Följ bara länken igen, så ser du en hel mängd metoder som klassen TQWidget tillhandahåller, inklusive metoden <methodname>show()</methodname>. Nu förstår vi vad som gjordes i exemplet med knappen: <orderedlist>
<listitem><para>Skapa en instans av <classname>QPushButton</classname>, och använd den andra konstruktorn för att ange knappens text</para></listitem>
<listitem><para>Skapa en instans av <classname>QPushButton</classname>, och använd den andra konstruktorn för att ange knappens text</para></listitem>
<listitem><para>Ändra storlek på komponenten till dess innehåll</para></listitem>
<listitem><para>Ändra storlek på komponenten till dess innehåll</para></listitem>
<listitem><para>Ange komponenten som huvudkomponent i instansen av <classname>QApplication</classname></para></listitem>
<listitem><para>Ange komponenten som huvudkomponent i instansen av <classname>QApplication</classname></para></listitem>
<listitem><para>Tala om för den grafiska komponenten att den ska visas på skärmen genom att anropa <methodname>show()</methodname>, en metod som ärvts från <classname>QWidget</classname></para></listitem>
<listitem><para>Tala om för den grafiska komponenten att den ska visas på skärmen genom att anropa <methodname>show()</methodname>, en metod som ärvts från <classname>TQWidget</classname></para></listitem>
</orderedlist>
</orderedlist>
</para>
</para>
<para>Efter att ha anropat metoden <methodname>exec()</methodname>, är programmet synligt för användaren, och visar ett fönster med knappen "Hello world!". Observera att program med grafiska gränssnitt beter sig något annorlunda jämfört med procedurbaserade program. Den viktigaste saken här är att programmet går in i en så kallad "huvudhändelsesnurra". Det betyder att programmet måste vänta på användarens åtgärder och därefter reagera på dem. Det betyder också, för ett QT-program, att programmet måste vara i huvudhändelsesnurran för att starta händelsehanteringen. Nästa avsnitt beskriver kortfattat vad det betyder förprogrammeraren och vad QT erbjuder för att hantera händelser. </para>
<para>Efter att ha anropat metoden <methodname>exec()</methodname>, är programmet synligt för användaren, och visar ett fönster med knappen "Hello world!". Observera att program med grafiska gränssnitt beter sig något annorlunda jämfört med procedurbaserade program. Den viktigaste saken här är att programmet går in i en så kallad "huvudhändelsesnurra". Det betyder att programmet måste vänta på användarens åtgärder och därefter reagera på dem. Det betyder också, för ett QT-program, att programmet måste vara i huvudhändelsesnurran för att starta händelsehanteringen. Nästa avsnitt beskriver kortfattat vad det betyder förprogrammeraren och vad QT erbjuder för att hantera händelser. </para>
<note><para>För användare som redan är avancerade: Knappen har ingen överliggande komponent deklarerad i konstruktorn. Därför är den en toppnivåkomponent och kör med en lokal händelsesnurra som inte behöver vänta på huvudhändelsesnurran. Se dokumentationen för klassen QWidget och KDE:s biblioteksreferensguide.</para>
<note><para>För användare som redan är avancerade: Knappen har ingen överliggande komponent deklarerad i konstruktorn. Därför är den en toppnivåkomponent och kör med en lokal händelsesnurra som inte behöver vänta på huvudhändelsesnurran. Se dokumentationen för klassen TQWidget och KDE:s biblioteksreferensguide.</para>
</note>
</note>
</sect3>
</sect3>
@ -183,7 +183,7 @@ return a.exec();
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Nu fortsätter vi med att ge programmet "liv" genom att behandla användarhändelser. I allmänhet har användaren två sätt att kommunicera med ett program: musen och tangentbordet. Ett grafiskt användargränssnitt måste tillhandahålla metoder för båda sätten, som detekterar åtgärder och gör något som reaktion på åtgärderna. </para>
<para>Nu fortsätter vi med att ge programmet "liv" genom att behandla användarhändelser. I allmänhet har användaren två sätt att kommunicera med ett program: musen och tangentbordet. Ett grafiskt användargränssnitt måste tillhandahålla metoder för båda sätten, som detekterar åtgärder och gör något som reaktion på åtgärderna. </para>
<para>Fönstersystemet skickar därför alla kommunikationshändelser till motsvarande program. <classname>QApplication</classname> skickar dem därefter till det aktiva fönstret som ett <classname>QEvent</classname>, och komponenterna själva måste bestämma vad som ska göras med dem. En komponent tar emot händelsen och behandlar <methodname>QWidget::event(QEvent*)</methodname>, som avgör vilken händelse som har skett och hur reaktionen ska ske. Metoden <methodname>event()</methodname> gör därför den huvudsakliga händelsehanteringen. Därefter skickar metoden <methodname>event()</methodname> händelsen till så kallade händelsefilter som avgör vad som sker och vad som ska göras med händelsen. Om inget filter signalerar att det är ansvarigt för händelsen, anropas speciell händelsehantering. Därigenom kan vi skilja mellan: <itemizedlist>
<para>Fönstersystemet skickar därför alla kommunikationshändelser till motsvarande program. <classname>QApplication</classname> skickar dem därefter till det aktiva fönstret som ett <classname>QEvent</classname>, och komponenterna själva måste bestämma vad som ska göras med dem. En komponent tar emot händelsen och behandlar <methodname>TQWidget::event(QEvent*)</methodname>, som avgör vilken händelse som har skett och hur reaktionen ska ske. Metoden <methodname>event()</methodname> gör därför den huvudsakliga händelsehanteringen. Därefter skickar metoden <methodname>event()</methodname> händelsen till så kallade händelsefilter som avgör vad som sker och vad som ska göras med händelsen. Om inget filter signalerar att det är ansvarigt för händelsen, anropas speciell händelsehantering. Därigenom kan vi skilja mellan: <itemizedlist>
<listitem><para>Tangentbordshändelser: Tangenterna Tabulator och Skift+Tabulator:</para>
<listitem><para>Tangentbordshändelser: Tangenterna Tabulator och Skift+Tabulator:</para>
<para>Observera att alla händelsefunktioner är virtuella och protected. Därför kan du implementera om händelser som du behöver i egna komponenter och ange hur din komponent ska reagera. <classname>QWidget</classname> innehåller också några andra virtuella metoder som kan vara användbara i dina program. Hur som helst, är det nödvändigt att känna till <classname>QWidget</classname> väl. </para>
<para>Observera att alla händelsefunktioner är virtuella och protected. Därför kan du implementera om händelser som du behöver i egna komponenter och ange hur din komponent ska reagera. <classname>TQWidget</classname> innehåller också några andra virtuella metoder som kan vara användbara i dina program. Hur som helst, är det nödvändigt att känna till <classname>TQWidget</classname> väl. </para>
</sect2>
</sect2>
<sect2 id="c1s2s4">
<sect2 id="c1s2s4">
<title>Interaktion mellan objekt med signaler och slots</title>
<title>Interaktion mellan objekt med signaler och slots</title>
<para>Nu kommer vi till den mest uppenbara fördelen med QT-verktygslådan: signal/slot-mekanismen. Den erbjuder en mycket bekväm och användbar lösning för kommunikation mellan objekt, som oftast löses med återanropsfunktioner i X-windows verktygslådor. Eftersom kommunikationen kräver strikt programmering och ibland gör det mycket svårt att skapa användargränssnitt (som beskrivs i QT-dokumentationen och förklaras i Programming with Qt av K. Dalheimer), uppfann TrollTech ett nytt system där objekt kan skicka signaler som kan anslutas till metoder som deklareras som slots. Som programmerare av C++, behöver man bara veta några saker om mekanismen: <itemizedlist>
<para>Nu kommer vi till den mest uppenbara fördelen med QT-verktygslådan: signal/slot-mekanismen. Den erbjuder en mycket bekväm och användbar lösning för kommunikation mellan objekt, som oftast löses med återanropsfunktioner i X-windows verktygslådor. Eftersom kommunikationen kräver strikt programmering och ibland gör det mycket svårt att skapa användargränssnitt (som beskrivs i QT-dokumentationen och förklaras i Programming with Qt av K. Dalheimer), uppfann TrollTech ett nytt system där objekt kan skicka signaler som kan anslutas till metoder som deklareras som slots. Som programmerare av C++, behöver man bara veta några saker om mekanismen: <itemizedlist>
<listitem><para>klassdeklarationen av en klass som använder signaler och slots måste innehålla makrot TQ_OBJECT i början (utan ett semikolon), och måste härledas från klassen <classname>QObject</classname> </para></listitem>
<listitem><para>klassdeklarationen av en klass som använder signaler och slots måste innehålla makrot TQ_OBJECT i början (utan ett semikolon), och måste härledas från klassen <classname>TQObject</classname> </para></listitem>
<listitem><para>en signal kan skickas med nyckelordet emit, t.ex. emit signal(parametrar);, inne i vilken medlemsfunktion som helst i en klass som tillåter användning av signaler och slots </para></listitem>
<listitem><para>en signal kan skickas med nyckelordet emit, t.ex. emit signal(parametrar);, inne i vilken medlemsfunktion som helst i en klass som tillåter användning av signaler och slots </para></listitem>
<listitem><para>alla signaler som används av klasser som inte ärvs måste läggas till i klassdeklarationen i en signalsektion </para></listitem>
<listitem><para>alla signaler som används av klasser som inte ärvs måste läggas till i klassdeklarationen i en signalsektion </para></listitem>
@ -237,9 +237,9 @@ return a.exec();
<listitem><para>metaobjektkompilatorn moc har körts för deklarationsfilen för att expandera makron och skapa implementeringen (som man inte behöverkänna till). Utdatafilerna från moc kompileras också av C++ kompilatorn. </para></listitem>
<listitem><para>metaobjektkompilatorn moc har körts för deklarationsfilen för att expandera makron och skapa implementeringen (som man inte behöverkänna till). Utdatafilerna från moc kompileras också av C++ kompilatorn. </para></listitem>
</itemizedlist>
</itemizedlist>
</para>
</para>
<para>Ett annat sätt att använda signaler utan att härleda från <classname>QObject</classname> är att använda klassen <classname>QSignal</classname>. Se referensdokumentationen för mer information och exempel på användning. Vi antar att du härleder från <classname>QObject</classname> i det följande. </para>
<para>Ett annat sätt att använda signaler utan att härleda från <classname>TQObject</classname> är att använda klassen <classname>QSignal</classname>. Se referensdokumentationen för mer information och exempel på användning. Vi antar att du härleder från <classname>TQObject</classname> i det följande. </para>
<para>På detta sätt kan din klass skicka signaler vart som helst och tillhandahålla slots som signaler kan anslutas till. Genom att använda en signal, behöver du inte bry dig om vem som tar emot den. Du behöver bara skicka signalen, och vilken slot du än ansluter till den kan reagera när den skickas. Dessutom kan en slot användas som en vanlig metod i implementeringen. </para>
<para>På detta sätt kan din klass skicka signaler vart som helst och tillhandahålla slots som signaler kan anslutas till. Genom att använda en signal, behöver du inte bry dig om vem som tar emot den. Du behöver bara skicka signalen, och vilken slot du än ansluter till den kan reagera när den skickas. Dessutom kan en slot användas som en vanlig metod i implementeringen. </para>
<para>För att nu ansluta en signal till en slot, måste du använda metoderna <methodname>connect()</methodname> som tillhandahålls av <classname>QObject</classname> eller, om tillgängliga, speciella metoder som objekt tillhandahåller för att ange anslutningen för en viss signal. </para>
<para>För att nu ansluta en signal till en slot, måste du använda metoderna <methodname>connect()</methodname> som tillhandahålls av <classname>TQObject</classname> eller, om tillgängliga, speciella metoder som objekt tillhandahåller för att ange anslutningen för en viss signal. </para>
<para>Du märker att allt du måste lägga till för att ge knappen mer kommunikation är metoden <methodname>connect()</methodname>: <methodname>connect (&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>;. Vad är betydelsen nu? Klassdeklarationen av QObject säger följande om metoden <methodname>connect()</methodname>: </para>
<para>Du märker att allt du måste lägga till för att ge knappen mer kommunikation är metoden <methodname>connect()</methodname>: <methodname>connect (&hello, SIGNAL( clicked() ), &a, SLOT( quit() ))</methodname>;. Vad är betydelsen nu? Klassdeklarationen av TQObject säger följande om metoden <methodname>connect()</methodname>: </para>
<para>Detta betyder att du måste ange en <classname>QObject</classname>-instanspekare som är signalens avsändare, vilket betyder att den kan skicka signalen, som första parameter. Därefter måste du ange signalen som du vill ansluta till. De två sista parametrarna är mottagarobjektet som tillhandahåller en slot, följt av medlemsfunktionen som är en verklig slot som kommer att köras när signalen skickas. </para>
<para>Detta betyder att du måste ange en <classname>TQObject</classname>-instanspekare som är signalens avsändare, vilket betyder att den kan skicka signalen, som första parameter. Därefter måste du ange signalen som du vill ansluta till. De två sista parametrarna är mottagarobjektet som tillhandahåller en slot, följt av medlemsfunktionen som är en verklig slot som kommer att köras när signalen skickas. </para>
<para>Genom att använda signaler och slots, kan programmets objekt enkelt kommunicera med varandra utan att uttryckligen bero på typen hos mottagarobjektet. Du får lära dig mer om hur den här mekanismen används produktivt senare i handboken. Mer information om signal/slot-mekanismen finns också i <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE:s biblioteksreferensguide</ulink> och <ulink url="doc.trolltech.com">QT:s direktreferens</ulink>. </para>
<para>Genom att använda signaler och slots, kan programmets objekt enkelt kommunicera med varandra utan att uttryckligen bero på typen hos mottagarobjektet. Du får lära dig mer om hur den här mekanismen används produktivt senare i handboken. Mer information om signal/slot-mekanismen finns också i <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE:s biblioteksreferensguide</ulink> och <ulink url="doc.trolltech.com">QT:s direktreferens</ulink>. </para>
<para>Du märker att vi först har ändrat från <classname>QApplication</classname> till <classname>TDEApplication</classname>. Dessutom var vi tvungna att ändra den tidigare använda metoden <methodname>setMainWidget()</methodname> till <methodname>setTopWidget</methodname> som <classname>TDEApplication</classname> använder för att ange huvudkomponenten. Det är allt! Ditt första KDE-program är klart. Du behöver bara tala om för kompilatorn vilken deklarationssökväg KDE har, och för länkaren att den ska länka med tdecore-biblioteket med -ltdecore. </para>
<para>Du märker att vi först har ändrat från <classname>QApplication</classname> till <classname>TDEApplication</classname>. Dessutom var vi tvungna att ändra den tidigare använda metoden <methodname>setMainWidget()</methodname> till <methodname>setTopWidget</methodname> som <classname>TDEApplication</classname> använder för att ange huvudkomponenten. Det är allt! Ditt första KDE-program är klart. Du behöver bara tala om för kompilatorn vilken deklarationssökväg KDE har, och för länkaren att den ska länka med tdecore-biblioteket med -ltdecore. </para>
<para>Eftersom du nu åtminstone vet vad funktionen <function>main()</function> i allmänhet tillhandahåller, och hur ett program blir synligt och tillåter kommunikation mellan användare och objekt, fortsätter vi med nästa kapitel, där vårt första program med &tdevelop; skapas. Där kan du också prova allting som tidigare nämnts, och se effekterna. </para>
<para>Eftersom du nu åtminstone vet vad funktionen <function>main()</function> i allmänhet tillhandahåller, och hur ett program blir synligt och tillåter kommunikation mellan användare och objekt, fortsätter vi med nästa kapitel, där vårt första program med &tdevelop; skapas. Där kan du också prova allting som tidigare nämnts, och se effekterna. </para>
<para>Vad du ytterligare bör ha tittat på hittills är QT-referensdokumentationen, särskilt klasserna <classname>QApplication</classname>, <classname>QWidget</classname> och <classname>QObject</classname> och tdecore-biblioteksdokumentationen för klassen <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE:s biblioteksreferensguide</ulink> har också en fullständig beskrivning av hur konstruktorerna i <classname>QApplication</classname> och <classname>TDEApplication</classname> anropas, inklusive behandling av kommandoradsväljare. </para>
<para>Vad du ytterligare bör ha tittat på hittills är QT-referensdokumentationen, särskilt klasserna <classname>QApplication</classname>, <classname>TQWidget</classname> och <classname>TQObject</classname> och tdecore-biblioteksdokumentationen för klassen <classname>TDEApplication</classname>. <ulink url="developer.kde.org/documentation/library/libraryref.html">KDE:s biblioteksreferensguide</ulink> har också en fullständig beskrivning av hur konstruktorerna i <classname>QApplication</classname> och <classname>TDEApplication</classname> anropas, inklusive behandling av kommandoradsväljare. </para>
</sect2>
</sect2>
</sect1>
</sect1>
@ -549,10 +549,10 @@ return a.exec();
16 statusBar()->show();
16 statusBar()->show();
17
17
18 // tillåt vyn att ändra statusraden och rubriken
18 // tillåt vyn att ändra statusraden och rubriken
<para>Det behöver inte sägas att stabilitet är ett av huvudmålen med konstruktionen. Ingen kan förhindra fel, men ett minimum kan åtminstone uppnås med smarta konstruktionsmål och utbredd användning av objektorienterad konstruktion. C++ gör det till ett nöje att programmera om du vet hur man utnyttjar dess möjligheter - arv, att dölja information och återanvändning av befintlig kod. </para>
<para>Det behöver inte sägas att stabilitet är ett av huvudmålen med konstruktionen. Ingen kan förhindra fel, men ett minimum kan åtminstone uppnås med smarta konstruktionsmål och utbredd användning av objektorienterad konstruktion. C++ gör det till ett nöje att programmera om du vet hur man utnyttjar dess möjligheter - arv, att dölja information och återanvändning av befintlig kod. </para>
<para>När ett KDE- eller QT-projekt skapas, måste du alltid ha en vy som ärver en QWidget, antingen med direkt arv eller eftersom en bibliotekskomponent som du vill använda ärver QWidget. Därför harProgramguiden redan skapat en vy som är en instans av klassen programnamnView, som redan ärver QWidget. </para>
<para>När ett KDE- eller QT-projekt skapas, måste du alltid ha en vy som ärver en TQWidget, antingen med direkt arv eller eftersom en bibliotekskomponent som du vill använda ärver TQWidget. Därför harProgramguiden redan skapat en vy som är en instans av klassen programnamnView, som redan ärver TQWidget. </para>
<para>Det här kapitlet beskriver därför hur bibliotekskomponenter används för att skapa vyer för KDE- och QT-program som skapas med &tdevelop;. Därefter tar vi en titt på biblioteken och vilka sorters vyer de redan erbjuder. </para>
<para>Det här kapitlet beskriver därför hur bibliotekskomponenter används för att skapa vyer för KDE- och QT-program som skapas med &tdevelop;. Därefter tar vi en titt på biblioteken och vilka sorters vyer de redan erbjuder. </para>
</sect1>
</sect1>
<sect1 id="c4s2">
<sect1 id="c4s2">
@ -601,7 +601,7 @@ return a.exec();
<para>När du tittar på första sidan av QT:s direktdokumentation, hittar du en länk till "Widget Screenshots", där du kan titta på hur de grafiska komponenterna som QT innehåller ser ut. De är färdiga att använda, och kan kombineras för att ge komplexa komponenter som kan skapa programvyer eller dialogrutor. I följande stycken beskriver vi några av dessa, som är mycket användbara för att skapa programvyer, men kom ihåg att KDE-biblioteken ibland innehåller andra komponenter med samma syfte. Dessa granskas i nästa avsnitt. </para>
<para>När du tittar på första sidan av QT:s direktdokumentation, hittar du en länk till "Widget Screenshots", där du kan titta på hur de grafiska komponenterna som QT innehåller ser ut. De är färdiga att använda, och kan kombineras för att ge komplexa komponenter som kan skapa programvyer eller dialogrutor. I följande stycken beskriver vi några av dessa, som är mycket användbara för att skapa programvyer, men kom ihåg att KDE-biblioteken ibland innehåller andra komponenter med samma syfte. Dessa granskas i nästa avsnitt. </para>
<para>Här är några tips om vilken Qt-komponent som kan användas för vilket ändamål: <orderedlist>
<para>Här är några tips om vilken Qt-komponent som kan användas för vilket ändamål: <orderedlist>
<listitem><para>Om vyområdet inte är stort nog för att visa all data, måste användaren kunna panorera i dokumentet med lister till vänster och längst ner i vyn. QT tillhandahåller klassen <classname>QScrollView</classname> för detta, som erbjuder ett underliggande område med panoreringsmöjlighet. Som tidigare förklarats, kan du låta din egen grafiska komponent ärva <classname>QScrollView</classname>, eller använda en instans för att hantera ditt dokuments vykomponent. </para></listitem>
<listitem><para>Om vyområdet inte är stort nog för att visa all data, måste användaren kunna panorera i dokumentet med lister till vänster och längst ner i vyn. QT tillhandahåller klassen <classname>QScrollView</classname> för detta, som erbjuder ett underliggande område med panoreringsmöjlighet. Som tidigare förklarats, kan du låta din egen grafiska komponent ärva <classname>QScrollView</classname>, eller använda en instans för att hantera ditt dokuments vykomponent. </para></listitem>
<listitem><para>För att skapa en egen ScrollView, låt komponenten View ärva från <classname>QWidget</classname> och lägg till vertikala och horisontella rullningslister med <classname>QScrollBars</classname>. (Detta görs av KDE:s komponent TDEHTMLView.) </para></listitem>
<listitem><para>För att skapa en egen ScrollView, låt komponenten View ärva från <classname>TQWidget</classname> och lägg till vertikala och horisontella rullningslister med <classname>QScrollBars</classname>. (Detta görs av KDE:s komponent TDEHTMLView.) </para></listitem>
<listitem><para>För textbehandling, använd <classname>QTextEdit</classname>. Den här klassen tillhandahåller en fullständig grafisk texteditorkomponent, som redan kan klippa ut, kopiera och klistra text och hanteras av en vy med rullningslister. </para></listitem>
<listitem><para>För textbehandling, använd <classname>QTextEdit</classname>. Den här klassen tillhandahåller en fullständig grafisk texteditorkomponent, som redan kan klippa ut, kopiera och klistra text och hanteras av en vy med rullningslister. </para></listitem>
<listitem><para>Använd <classname>QTable</classname> för att visa data som är arrangerat i en tabell. Eftersom <classname>QTable</classname> också hanteras av rullningslister, erbjuder den en bra lösning för program med tabellberäkningar. </para></listitem>
<listitem><para>Använd <classname>QTable</classname> för att visa data som är arrangerat i en tabell. Eftersom <classname>QTable</classname> också hanteras av rullningslister, erbjuder den en bra lösning för program med tabellberäkningar. </para></listitem>
<listitem><para>För att visa två olika grafiska komponenter eller två instanser av samma komponent samtidigt, använd <classname>QSplitter</classname>. Den tillåter att vyer läggs sida vid sida med horisontella eller vertikala avdelare. Kmail är ett bra exempel på hur det ser ut. Huvudfönstret är delat vertikalt av en avdelare, och det högra fönstret är återigen avdelat horisontellt. </para></listitem>
<listitem><para>För att visa två olika grafiska komponenter eller två instanser av samma komponent samtidigt, använd <classname>QSplitter</classname>. Den tillåter att vyer läggs sida vid sida med horisontella eller vertikala avdelare. Kmail är ett bra exempel på hur det ser ut. Huvudfönstret är delat vertikalt av en avdelare, och det högra fönstret är återigen avdelat horisontellt. </para></listitem>
@ -653,7 +653,7 @@ return a.exec();
<title>Inställning av snabbtangenter</title>
<title>Inställning av snabbtangenter</title>
<para>Något mycket professionellt som du alltid bör lägga till i programmet är snabbtangenter. De används oftast av erfarna användare som vill arbeta snabbt med sina program och är villiga att lära sig genvägar. KDE-biblioteken erbjuder klassen <classname>TDEAction</classname> för detta, som tillhandahåller snabbtangenter och åtkomst av globalt inställda standardgenvägar. </para>
<para>Något mycket professionellt som du alltid bör lägga till i programmet är snabbtangenter. De används oftast av erfarna användare som vill arbeta snabbt med sina program och är villiga att lära sig genvägar. KDE-biblioteken erbjuder klassen <classname>TDEAction</classname> för detta, som tillhandahåller snabbtangenter och åtkomst av globalt inställda standardgenvägar. </para>
<para>Normalt använder bara ramprogram skapade av &tdevelop; vanliga snabbtangenter som F1 för att komma åt direkthjälp, Ctrl+N för Ny fil, etc. </para>
<para>Normalt använder bara ramprogram skapade av &tdevelop; vanliga snabbtangenter som F1 för att komma åt direkthjälp, Ctrl+N för Ny fil, etc. </para>
<para>Om programmet innehåller många snabbtangenter bör du göra dem anpassningsbara via en inställningsmeny. Antingen kan det kombineras med annan programinställning i en QWidget eller vara ensamt. KDE-biblioteket tillhandahåller redan en <classname>KKeyChooser</classname> för att använda i flikdialogrutor, medan <classname>KKeyDialog</classname> tillhandahåller en inställningsdialogruta för snabbtangenter som är färdig att använda. </para>
<para>Om programmet innehåller många snabbtangenter bör du göra dem anpassningsbara via en inställningsmeny. Antingen kan det kombineras med annan programinställning i en TQWidget eller vara ensamt. KDE-biblioteket tillhandahåller redan en <classname>KKeyChooser</classname> för att använda i flikdialogrutor, medan <classname>KKeyDialog</classname> tillhandahåller en inställningsdialogruta för snabbtangenter som är färdig att använda. </para>
</sect1>
</sect1>
</chapter>
</chapter>
@ -696,7 +696,7 @@ return a.exec();
<sect1 id="c8s4">
<sect1 id="c8s4">
<title>Knappen <guibutton>Vad är det här?</guibutton></title>
<title>Knappen <guibutton>Vad är det här?</guibutton></title>
<para>Knappen <guibutton>Vad är det här...?</guibutton> tillhandahåller hjälpfönster med syftet att ge användaren hjälp med en viss komponent i vyn som används eller ett objekt i en verktygsrad. Den finns i verktygsraden och aktiveras när användaren trycker på knappen. Markören ändras till en pilmarkör med ett frågetecken, precis som knappen själv ser ut. Därefter kan användaren klicka på en synlig komponent och får då ett hjälpfönster. Som en övning kan du prova beteendet med knappen <guibutton>Vad är det här...?</guibutton> inne i &tdevelop;. </para>
<para>Knappen <guibutton>Vad är det här...?</guibutton> tillhandahåller hjälpfönster med syftet att ge användaren hjälp med en viss komponent i vyn som används eller ett objekt i en verktygsrad. Den finns i verktygsraden och aktiveras när användaren trycker på knappen. Markören ändras till en pilmarkör med ett frågetecken, precis som knappen själv ser ut. Därefter kan användaren klicka på en synlig komponent och får då ett hjälpfönster. Som en övning kan du prova beteendet med knappen <guibutton>Vad är det här...?</guibutton> inne i &tdevelop;. </para>
<para>För att lägga till "Vad är det här...?" hjälp i en av dina grafiska komponenter, använd den statiska metoden <methodname>QWhatsThis::add(QWidget *widget, const QString &text)</methodname> </para>
<para>För att lägga till "Vad är det här...?" hjälp i en av dina grafiska komponenter, använd den statiska metoden <methodname>QWhatsThis::add(TQWidget *widget, const TQString &text)</methodname> </para>
<para>Qt:s lågnivåritmodell är baserad på de möjligheter som erbjuds av X11 och andra fönstersystem där en version av Qt finns. Men den utökar också dem genom att implementera ytterligare funktioner som godtyckliga affina omvandlingar för text och pixmappar. </para>
<para>Qt:s lågnivåritmodell är baserad på de möjligheter som erbjuds av X11 och andra fönstersystem där en version av Qt finns. Men den utökar också dem genom att implementera ytterligare funktioner som godtyckliga affina omvandlingar för text och pixmappar. </para>
<para>Den centrala grafiska klassen för att rita tvådimensionellt med Qt är <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Den kan rita på en <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Det finns tre möjliga ritenheter implementerade: En är <ulink url="kdeapi:qt/QWidget">QWidget</ulink>, som representerar en grafisk komponent på skärmen. Den andra är <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, som representerar en skrivare, och producerar Postskript-utmatning. Den tredje är klassen <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, som spelar in ritkommandon och kan spara dem till disk, och sedan spela upp dem. Ett möjligt lagringsformat för ritkommandon är W3C-standarden SVG. </para>
<para>Den centrala grafiska klassen för att rita tvådimensionellt med Qt är <ulink url="kdeapi:qt/QPainter">QPainter</ulink>. Den kan rita på en <ulink url="kdeapi:qt/QPaintDevice">QPaintDevice</ulink>. Det finns tre möjliga ritenheter implementerade: En är <ulink url="kdeapi:qt/TQWidget">TQWidget</ulink>, som representerar en grafisk komponent på skärmen. Den andra är <ulink url="kdeapi:qt/QPrinter">QPrinter</ulink>, som representerar en skrivare, och producerar Postskript-utmatning. Den tredje är klassen <ulink url="kdeapi:qt/QPicture">QPicture</ulink>, som spelar in ritkommandon och kan spara dem till disk, och sedan spela upp dem. Ett möjligt lagringsformat för ritkommandon är W3C-standarden SVG. </para>
<para>Alltså är det möjligt att återanvända uppritningskoden som du använder för att visa en grafisk komponent för utskrift, med stöd för samma funktioner. Naturligtvis används koden i praktiken i ett något annorlunda sammanhang. Rita på en grafisk komponent görs nästan enbart i metoden paintEvent() i en komponentklass. </para>
<para>Alltså är det möjligt att återanvända uppritningskoden som du använder för att visa en grafisk komponent för utskrift, med stöd för samma funktioner. Naturligtvis används koden i praktiken i ett något annorlunda sammanhang. Rita på en grafisk komponent görs nästan enbart i metoden paintEvent() i en komponentklass. </para>
<para>Färger har betydelse både när kurvor ritas, och när former fylls i. Färger representeras av klassen <ulink url="kdeapi:qt/QColor">QColor</ulink> i Qt. Qt stöder inte avancerade grafikfunktioner som ICC-färgprofiler och färgkorrektion. Färger skapas oftast genom att ange deras röda, gröna och bläa komponenter, eftersom RGB-modellen är sättet som bildpunkter sätts samman på en bildskärm. </para>
<para>Färger har betydelse både när kurvor ritas, och när former fylls i. Färger representeras av klassen <ulink url="kdeapi:qt/TQColor">TQColor</ulink> i Qt. Qt stöder inte avancerade grafikfunktioner som ICC-färgprofiler och färgkorrektion. Färger skapas oftast genom att ange deras röda, gröna och bläa komponenter, eftersom RGB-modellen är sättet som bildpunkter sätts samman på en bildskärm. </para>
<para>Det är också möjligt att använda färgton, färgmättnad och värde. Den här HSV-representationen är den som används i GTK:s färgdialogruta, t.ex. i GIMP. Där motsvarar färgtonen en vinkel i färghjulet, medan färgmättnaden motsvarar avståndet från cirkelns mitt. Värdet väljs med ett särskilt skjutreglage. </para>
<para>Det är också möjligt att använda färgton, färgmättnad och värde. Den här HSV-representationen är den som används i GTK:s färgdialogruta, t.ex. i GIMP. Där motsvarar färgtonen en vinkel i färghjulet, medan färgmättnaden motsvarar avståndet från cirkelns mitt. Värdet väljs med ett särskilt skjutreglage. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> motsvarar direkt pixmappsobjekt i X11. En pixmapp är ett objekt på serversidan och kan, med ett modernt grafikkort, till och med lagras direkt i kortets minne. Det gör det <emphasis>mycket</emphasis> effektivt att överföra en pixmapp till skärmen. En pixmapp fungerar också som en motsvarighet till grafiska komponenter utanför skärmen. QPixmap-klassen är en delklass till QPaintDevice, så det går att rita på den med en QPainter. Elementära ritoperationer accelereras ofta av modern grafik. Därför är ett vanligt användningsmönster att använda en pixmapp för dubbelbuffring. Detta betyder att istället för att rita direkt på en grafisk komponent, ritar man på ett tillfälligt pixmappsobjekt och använder funktionen <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> för att överföra det till komponenten. För komplexa omritningar, hjälper detta till att undvika flimmer. </para>
<para><ulink url="kdeapi:qt/QPixmap">QPixmap</ulink> motsvarar direkt pixmappsobjekt i X11. En pixmapp är ett objekt på serversidan och kan, med ett modernt grafikkort, till och med lagras direkt i kortets minne. Det gör det <emphasis>mycket</emphasis> effektivt att överföra en pixmapp till skärmen. En pixmapp fungerar också som en motsvarighet till grafiska komponenter utanför skärmen. QPixmap-klassen är en delklass till QPaintDevice, så det går att rita på den med en QPainter. Elementära ritoperationer accelereras ofta av modern grafik. Därför är ett vanligt användningsmönster att använda en pixmapp för dubbelbuffring. Detta betyder att istället för att rita direkt på en grafisk komponent, ritar man på ett tillfälligt pixmappsobjekt och använder funktionen <ulink url="kdeapi:qt/QPaintDevice#bitBlt-1">bitBlt</ulink> för att överföra det till komponenten. För komplexa omritningar, hjälper detta till att undvika flimmer. </para>
<para>I motsats till detta, finns <ulink url="kdeapi:qt/QImage">QImage</ulink>-objekt på klientsidan. Deras huvuduppgift är att ge direkt åtkomst till bildpunkterna i bilden. Det gör dem användbara för bildhantering, och saker som att ladda och spara till disk (Metoden load() för QPixmap använder QImage som ett mellansteg). Å andra sidan, så blir uppritning av en bild på en grafisk komponent en ganska krävande åtgärd, eftersom det innebär en överföring till X-servern, vilket kan ta en viss tid, särskilt för stora bilder och fjärrservrar. Beroende på färgdjupet, kan konvertering från QImage till QPixmap också kräva användning av gitter. </para>
<para>I motsats till detta, finns <ulink url="kdeapi:qt/TQImage">TQImage</ulink>-objekt på klientsidan. Deras huvuduppgift är att ge direkt åtkomst till bildpunkterna i bilden. Det gör dem användbara för bildhantering, och saker som att ladda och spara till disk (Metoden load() för QPixmap använder TQImage som ett mellansteg). Å andra sidan, så blir uppritning av en bild på en grafisk komponent en ganska krävande åtgärd, eftersom det innebär en överföring till X-servern, vilket kan ta en viss tid, särskilt för stora bilder och fjärrservrar. Beroende på färgdjupet, kan konvertering från TQImage till QPixmap också kräva användning av gitter. </para>
<para>Text kan ritas med en av de överlastade varianterna av metoden QPainter::drawText(). De ritar en QString, antingen vid en given punkt eller inne i en given rektangel, med teckensnittet som ställts in med QPainter::setFont(). Det finns också en parameter som tar en ELLER-kombination av vissa flaggor från uppräkningstyperna <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> och <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink>. </para>
<para>Text kan ritas med en av de överlastade varianterna av metoden QPainter::drawText(). De ritar en TQString, antingen vid en given punkt eller inne i en given rektangel, med teckensnittet som ställts in med QPainter::setFont(). Det finns också en parameter som tar en ELLER-kombination av vissa flaggor från uppräkningstyperna <ulink url="kdeapi:qt/Qt#AlignmentFlags-enum">Qt::AlignmentFlags</ulink> och <ulink url="kdeapi:qt/Qt#TextFlags-enum">Qt::TextFlags</ulink>. </para>
<para>Med början i version 3.0, hanterar Qt fullständig textlayout också för språk som skrivs från höger till vänster. </para>
<para>Med början i version 3.0, hanterar Qt fullständig textlayout också för språk som skrivs från höger till vänster. </para>
<para>Förutom de vanliga posterna, förevisar det här exemplet hur man anger att en tjänst har vissa egenskaper. Varje definition av en egenskap motsvarar en grupp <literal>[PropertyDef::name]</literal> i konfigurationsfilen. I gruppen, anger posten <literal>Type</literal> egenskapens typ. Möjliga typer är allt som kan lagras i en <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
<para>Förutom de vanliga posterna, förevisar det här exemplet hur man anger att en tjänst har vissa egenskaper. Varje definition av en egenskap motsvarar en grupp <literal>[PropertyDef::name]</literal> i konfigurationsfilen. I gruppen, anger posten <literal>Type</literal> egenskapens typ. Möjliga typer är allt som kan lagras i en <ulink url="kdeapi:qt/QVariant">QVariant</ulink>. </para>
@ -1196,11 +1196,11 @@ X-KDevelop-Scope=Project
<para>Med objektet <classname>KService</classname> tillgängligt, kan du mycket lätt ladda biblioteket och få en pekare till dess tillverkningsobjekt. </para>
<para>Med objektet <classname>KService</classname> tillgängligt, kan du mycket lätt ladda biblioteket och få en pekare till dess tillverkningsobjekt. </para>
if (!client->isApplicationRegistered("tdeio_uiserver")) {
if (!client->isApplicationRegistered("tdeio_uiserver")) {
QString error;
TQString error;
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
if (TDEApplication::startServiceByName("tdeio_uiserver", QStringList(), &error))
cout << "Start av TDEIO-server misslyckades med meddelandet " << error << endl;
cout << "Start av TDEIO-server misslyckades med meddelandet " << error << endl;
}
}
@ -1275,7 +1275,7 @@ if (!client->call("tdeio_uiserver", "UIServer", "setListMode(bool)",
<para>I exemplet som ges här, startas tjänsten "med namn", dvs. första argumentet till <function>TDEApplication::startServiceByName() </function> är namnet, som det anges på raden <literal>Name</literal> i desktop-filen. Ett alternativ är att använda <function>TDEApplication::startServiceByDesktopName()</function>, som använder namnet på desktop-filen som argument, dvs. i det här fallet <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>I exemplet som ges här, startas tjänsten "med namn", dvs. första argumentet till <function>TDEApplication::startServiceByName() </function> är namnet, som det anges på raden <literal>Name</literal> i desktop-filen. Ett alternativ är att använda <function>TDEApplication::startServiceByDesktopName()</function>, som använder namnet på desktop-filen som argument, dvs. i det här fallet <literal>"tdeio_uiserver.desktop"</literal>. </para>
<para>Alla dessa anrop har en lista med webbadresser som andra argument, vilket ges till tjänsten på kommandoraden. Det tredje argumentet är en pekare till en <classname>QString</classname>. Om starten av tjänsten misslyckas, tilldelas det här argumentet det översatta felmeddelandet. </para>
<para>Alla dessa anrop har en lista med webbadresser som andra argument, vilket ges till tjänsten på kommandoraden. Det tredje argumentet är en pekare till en <classname>TQString</classname>. Om starten av tjänsten misslyckas, tilldelas det här argumentet det översatta felmeddelandet. </para>
</simplesect>
</simplesect>
@ -1385,7 +1385,7 @@ else
<para>Till och med KMimeMagic kan förstås bara avgöra filtypen från innehållet i en lokal fil. För fjärrfiler, finns ytterligare en möjlighet: </para>
<para>Till och med KMimeMagic kan förstås bara avgöra filtypen från innehållet i en lokal fil. För fjärrfiler, finns ytterligare en möjlighet: </para>
<para>Det här antar att du är inne i en &kommander; fil och har tillgång till specialvärdet @pid, som innehåller process-id. Det är i själva verket enklare att ersätta <quote>kmdr-executor-@pid</quote> med @dcopid. Du kan dock använda syntaxen (men förstås utan specialvärden) från kommandoraden eller vilket externt skript som helst för att ändra &kommander;-fönstret. </para>
<para>Det här antar att du är inne i en &kommander; fil och har tillgång till specialvärdet @pid, som innehåller process-id. Det är i själva verket enklare att ersätta <quote>kmdr-executor-@pid</quote> med @dcopid. Du kan dock använda syntaxen (men förstås utan specialvärden) från kommandoraden eller vilket externt skript som helst för att ändra &kommander;-fönstret. </para>
<para>&kommander; utvecklade den mycket snabbare interna &DCOP;-funktionen. Att använda den från ett annat programfönster (&DCOP; via terminalen är mycket långsamt) är mer komplicerat, eftersom du måste ange mycket information, inklusive anropets prototyp. Anropet ovan skulle bli (observera att @dcopid i själva verket är internt till dialogrutan, men det skulle kunna ersättas med giltigt processid): </para>
<para>&kommander; utvecklade den mycket snabbare interna &DCOP;-funktionen. Att använda den från ett annat programfönster (&DCOP; via terminalen är mycket långsamt) är mer komplicerat, eftersom du måste ange mycket information, inklusive anropets prototyp. Anropet ovan skulle bli (observera att @dcopid i själva verket är internt till dialogrutan, men det skulle kunna ersättas med giltigt processid): </para>
<para>I tidiga versioner av &kommander; använde lokala &DCOP;-anrop inne i skriptspråkstrukturer (som <application>bash</application>) anrop med terminalmetoder. <emphasis>Om du använder intern &DCOP; körs alla &kommander; specialvärden först och därefter körs skriptet.</emphasis> Läs föregående mening igen, eftersom det kommer att ge dig många sorger och bekymmer med en <application>bash</application>-snurra som använder &kommander;-specialvärden. </para>
<para>I tidiga versioner av &kommander; använde lokala &DCOP;-anrop inne i skriptspråkstrukturer (som <application>bash</application>) anrop med terminalmetoder. <emphasis>Om du använder intern &DCOP; körs alla &kommander; specialvärden först och därefter körs skriptet.</emphasis> Läs föregående mening igen, eftersom det kommer att ge dig många sorger och bekymmer med en <application>bash</application>-snurra som använder &kommander;-specialvärden. </para>
<para>Det finns ett nytt förenklat sätt att använda &DCOP; inne i &kommander; genom att använda en objektsyntax. Låt oss anta att du vill ändra texten i den grafiska komponenten @Radeditor1. Det skulle se ut så här: </para>
<para>Det finns ett nytt förenklat sätt att använda &DCOP; inne i &kommander; genom att använda en objektsyntax. Låt oss anta att du vill ändra texten i den grafiska komponenten @Radeditor1. Det skulle se ut så här: </para>
<para>Returnerar den angivna globala variabelns värde. När ett skript körs från ett fönster i &kommander; upphör alla (icke-globala) variabler som anges i skriptet att existera efter skriptet är färdigt, och är därför inte tillgängliga för andra skriptprocesser eller i en ny instans av den anropande processen. Det globala <quote>omfattningen</quote> betyder att variabeln existerar för alla fönstrets processer ända till fönstret stängs. Du kan ändra variablerna när som helst med ett nytt anrop till <function>@setGlobal</function>. </para>
<para>Returnerar den angivna globala variabelns värde. När ett skript körs från ett fönster i &kommander; upphör alla (icke-globala) variabler som anges i skriptet att existera efter skriptet är färdigt, och är därför inte tillgängliga för andra skriptprocesser eller i en ny instans av den anropande processen. Det globala <quote>omfattningen</quote> betyder att variabeln existerar för alla fönstrets processer ända till fönstret stängs. Du kan ändra variablerna när som helst med ett nytt anrop till <function>@setGlobal</function>. </para>
<para>Skapar en variabel som är global i fönsterprocessen och tilldelar värdet till den. Värdet kan hämtas med global(QString variabelnamn) eller tilldelas igen. </para>
<para>Skapar en variabel som är global i fönsterprocessen och tilldelar värdet till den. Värdet kan hämtas med global(TQString variabelnamn) eller tilldelas igen. </para>
<para>Följande lista är gammal, och finns bara kvar i referenssyfte. Titta i <emphasis>funktionsbläddraren</emphasis> för en fullständig och aktuell referens till alla grafiska komponentfunktioner, som är tillgänglig från alla texteditorfönster i &kommander; genom att klicka på knappen längst ner till vänster. De är nu komponentfunktioner, inte &DCOP;-funktioner, men &DCOP;-funktionerna är publicerade i &DCOP;-gränssnittet <emphasis>KommanderIf</emphasis> som beskrivs ovan. Dialogrutor för att lista och skapa anrop till dessa funktioner är tillgängliga på vår webbplats. </para>
<para>Följande lista är gammal, och finns bara kvar i referenssyfte. Titta i <emphasis>funktionsbläddraren</emphasis> för en fullständig och aktuell referens till alla grafiska komponentfunktioner, som är tillgänglig från alla texteditorfönster i &kommander; genom att klicka på knappen längst ner till vänster. De är nu komponentfunktioner, inte &DCOP;-funktioner, men &DCOP;-funktionerna är publicerade i &DCOP;-gränssnittet <emphasis>KommanderIf</emphasis> som beskrivs ovan. Dialogrutor för att lista och skapa anrop till dessa funktioner är tillgängliga på vår webbplats. </para>
<variablelist>
<variablelist>
<varlistentry>
<varlistentry>
<term>setText(QString text)</term>
<term>setText(TQString text)</term>
<listitem>
<listitem>
<para>Det här tar bort texten som visas i den grafiska komponenten och ersätter den med den angivna texten. </para>
<para>Det här tar bort texten som visas i den grafiska komponenten och ersätter den med den angivna texten. </para>
<para>Det här tilldelar den förvalda strängen för &kommander; text. Den tilldelas typiskt värdet <quote>@widgetText</quote> för att visa vad som skrivs in i komponenten. Det är inte troligt att du har mycket nytta av det, men om du gör det finns det där. Gäller alla grafiska komponenter som kan innehålla data. </para>
<para>Det här tilldelar den förvalda strängen för &kommander; text. Den tilldelas typiskt värdet <quote>@widgetText</quote> för att visa vad som skrivs in i komponenten. Det är inte troligt att du har mycket nytta av det, men om du gör det finns det där. Gäller alla grafiska komponenter som kan innehålla data. </para>
<para>Det mesta av detta är bara mallkod som du inte behöver bry dig om. De enda två saker du måste försäkra dig om är att filen kommanderwidget.h inkluderas längst upp, och att klassen först härleds från komponenten vi önskar integrera med &kommander; och därefter från KommanderWidget. </para>
<para>Det mesta av detta är bara mallkod som du inte behöver bry dig om. De enda två saker du måste försäkra dig om är att filen kommanderwidget.h inkluderas längst upp, och att klassen först härleds från komponenten vi önskar integrera med &kommander; och därefter från KommanderWidget. </para>
<para>Det finns några delar i cpp-filen som är viktiga för varje enskild komponent. </para>
<para>Det finns några delar i cpp-filen som är viktiga för varje enskild komponent. </para>
<para>Vi anger tillstånden komponenten kan ha i konstruktorn. Vår radeditor har ingen form av tillstånd, så vi ger den bara tillståndet <emphasis>default</emphasis>. Om du skapar en komponent som har olika tillstånd, som en kryssruta, kan du ange tre tillstånd <emphasis>unchecked</emphasis>, <emphasis>semichecked</emphasis> och <emphasis>checked</emphasis> här. </para>
<para>Vi anger tillstånden komponenten kan ha i konstruktorn. Vår radeditor har ingen form av tillstånd, så vi ger den bara tillståndet <emphasis>default</emphasis>. Om du skapar en komponent som har olika tillstånd, som en kryssruta, kan du ange tre tillstånd <emphasis>unchecked</emphasis>, <emphasis>semichecked</emphasis> och <emphasis>checked</emphasis> här. </para>
<para>Vi angav tillstånden i konstruktorn ovan, och detta returnerar bara komponentens nuvarande tillstånd. För vår komponent är det alltid <emphasis>default</emphasis>, men du bör lägga till kod här som kontrollerar vilket tillstånd komponenten för närvarande har, och returnerar lämplig sträng här. </para>
<para>Vi angav tillstånden i konstruktorn ovan, och detta returnerar bara komponentens nuvarande tillstånd. För vår komponent är det alltid <emphasis>default</emphasis>, men du bör lägga till kod här som kontrollerar vilket tillstånd komponenten för närvarande har, och returnerar lämplig sträng här. </para>
<para>Detta är de två viktigaste metoderna, där den största delen av koden som utgör funktionen finns. Metoden <emphasis>QString KomLineEdit::widgetText() const</emphasis> returnerar komponenttexten (texten som <emphasis>@widgetText</emphasis> expanderas till i textassociationer). Komponenttexten i vår komponent är helt enkelt texten i radeditorn, så vi returnerar den. På liknande sätt, när komponenttexten ändras, ändrar vi bara texten i radeditorn. Vi skickar signalen <emphasis>widgetTextChanged()</emphasis> efter komponenttexten har ändrats, så att andra komponenter kan får reda på det faktum att komponenten har uppdaterats. </para>
<para>Detta är de två viktigaste metoderna, där den största delen av koden som utgör funktionen finns. Metoden <emphasis>TQString KomLineEdit::widgetText() const</emphasis> returnerar komponenttexten (texten som <emphasis>@widgetText</emphasis> expanderas till i textassociationer). Komponenttexten i vår komponent är helt enkelt texten i radeditorn, så vi returnerar den. På liknande sätt, när komponenttexten ändras, ändrar vi bara texten i radeditorn. Vi skickar signalen <emphasis>widgetTextChanged()</emphasis> efter komponenttexten har ändrats, så att andra komponenter kan får reda på det faktum att komponenten har uppdaterats. </para>
<para>För att lägga till funktioner i komponenten, måste du registrera några funktioner och lägga till kod för att hantera dem. Här är koden som används för att registrera dem. Lägg den i början av cpp-filen, ovanför konstruktorn. </para>
<para>För att lägga till funktioner i komponenten, måste du registrera några funktioner och lägga till kod för att hantera dem. Här är koden som används för att registrera dem. Lägg den i början av cpp-filen, ovanför konstruktorn. </para>
KommanderPlugin::registerFunction(Function1, "function1(QString widget, QString arg1, int arg2)", i18n("Call function1 with two arguments, second is optional."), 2, 3);
KommanderPlugin::registerFunction(Function1, "function1(TQString widget, TQString arg1, int arg2)", i18n("Call function1 with two arguments, second is optional."), 2, 3);
KommanderPlugin::registerFunction(function2, "function2(QString widget)", i18n("Get a QString as a result of function2."), 1);
KommanderPlugin::registerFunction(function2, "function2(TQString widget)", i18n("Get a TQString as a result of function2."), 1);
}
}
</screen>
</screen>
<para>Detta registrerar två funktioner: <emphasis>function1 och function2</emphasis> Numren som tilldelas funktionerna (här <emphasis>1160</emphasis> och <emphasis>1161</emphasis>) måste vara unika, och inte användas av några andra insticksprogram eller inne i &kommander;. <emphasis>function1</emphasis> har två argument, ett valfritt, <emphasis>function2</emphasis> har inget argument och returnerar en sträng. Argumentet <emphasis>QString widget</emphasis> i signaturerna anger att funktionerna arbetar med en grafisk komponent, som: <emphasis>KomLineEdit.function1("komponent", 1)</emphasis>. </para>
<para>Detta registrerar två funktioner: <emphasis>function1 och function2</emphasis> Numren som tilldelas funktionerna (här <emphasis>1160</emphasis> och <emphasis>1161</emphasis>) måste vara unika, och inte användas av några andra insticksprogram eller inne i &kommander;. <emphasis>function1</emphasis> har två argument, ett valfritt, <emphasis>function2</emphasis> har inget argument och returnerar en sträng. Argumentet <emphasis>TQString widget</emphasis> i signaturerna anger att funktionerna arbetar med en grafisk komponent, som: <emphasis>KomLineEdit.function1("komponent", 1)</emphasis>. </para>
<para>För att lära &kommander; att komponenten stöder dessa funktioner, lägg till en metod på följande sätt: </para>
<para>För att lära &kommander; att komponenten stöder dessa funktioner, lägg till en metod på följande sätt: </para>
<para>Det betyder att KomLineEdit stöder funktionerna ovan, och den vanliga funktionen <emphasis>text</emphasis>. Funktionskoden ska hanteras inne i metoden handeDCOP: </para>
<para>Det betyder att KomLineEdit stöder funktionerna ovan, och den vanliga funktionen <emphasis>text</emphasis>. Funktionskoden ska hanteras inne i metoden handeDCOP: </para>
<para>Det finns tillfällen då komponenten ska se annorlunda ut i editorn än när den körs, vilket är fallet för skriptobjekt, om-dialogruta, etc. Den vanliga lösningen är att visa en QLabel istället för komponenten. För att göra det måste komponenten härledas från QLabel, och använda följande i konstruktorn: </para>
<para>Det finns tillfällen då komponenten ska se annorlunda ut i editorn än när den körs, vilket är fallet för skriptobjekt, om-dialogruta, etc. Den vanliga lösningen är att visa en QLabel istället för komponenten. För att göra det måste komponenten härledas från QLabel, och använda följande i konstruktorn: </para>
<para>Du kan skapa själva komponenten (om en komponent över huvud taget behövs, kanske "komponenten" bara tillhandahåller funktioner för att t.ex. komma åt en databas) i en av dina funktioner, som i funktionen <emphasis>execute</emphasis>. Här är ett exempel från komponenten om-dialogruta: </para>
<para>Du kan skapa själva komponenten (om en komponent över huvud taget behövs, kanske "komponenten" bara tillhandahåller funktioner för att t.ex. komma åt en databas) i en av dina funktioner, som i funktionen <emphasis>execute</emphasis>. Här är ett exempel från komponenten om-dialogruta: </para>
<para>Därefter skapar vi delklassen KommanderPlugin som kallas <emphasis>MyKomPlugin</emphasis>. Klassen har helt enkelt en konstruktor och den överskridna metoden create. </para>
<para>Därefter skapar vi delklassen KommanderPlugin som kallas <emphasis>MyKomPlugin</emphasis>. Klassen har helt enkelt en konstruktor och den överskridna metoden create. </para>
@ -196,7 +196,7 @@ public:
</screen>
</screen>
<para>I insticksprogrammets konstruktor, anropar vi <emphasis>addWidget()</emphasis>för varje komponent vi vill tillhandahålla i insticksprogrammet. <emphasis>addWidget()</emphasis> har sex argument, men bara de fyra första krävs. I ordning är argumenten, komponentklassens namn, grupp, verktygstips, en ikonuppsättning för ikonen som används i editorns verktygsrad, vad är det här-information, och en Boolean som anger om komponenten är omgivande komponent för andra komponenter eller inte. Informationen används av editorn när komponenten grupperas i menyer, tillhandahåller hjälpinformation, etc. </para>
<para>I insticksprogrammets konstruktor, anropar vi <emphasis>addWidget()</emphasis>för varje komponent vi vill tillhandahålla i insticksprogrammet. <emphasis>addWidget()</emphasis> har sex argument, men bara de fyra första krävs. I ordning är argumenten, komponentklassens namn, grupp, verktygstips, en ikonuppsättning för ikonen som används i editorns verktygsrad, vad är det här-information, och en Boolean som anger om komponenten är omgivande komponent för andra komponenter eller inte. Informationen används av editorn när komponenten grupperas i menyer, tillhandahåller hjälpinformation, etc. </para>
<para>När det gäller ikonen, så laddar exemplet ovan en ikon av medelstorlek som kallas <emphasis>iconname</emphasis> från &kde;:s vanliga ikonplats. </para>
<para>När det gäller ikonen, så laddar exemplet ovan en ikon av medelstorlek som kallas <emphasis>iconname</emphasis> från &kde;:s vanliga ikonplats. </para>
@ -177,7 +177,7 @@ debug(resultat)</screen> Inne i skriptet kan det se ut så här:<screen>var = st
return(var)</screen> Nu får du ett returvärde i meddelandeloggen via <emphasis>standardfelutmatningen</emphasis> som är <emphasis>HEJ ALLIHOP</emphasis>. </para>
return(var)</screen> Nu får du ett returvärde i meddelandeloggen via <emphasis>standardfelutmatningen</emphasis> som är <emphasis>HEJ ALLIHOP</emphasis>. </para>
<para>Att ta emot en signal som är ansluten till en skriptslot fungerar på samma sätt. <emphasis>Self.Item(0)</emphasis> är parameter ett och så vidare. Du kan hämta antal argument som skickas via <emphasis>Skriptobjekt.count</emphasis>. </para>
<para>Att ta emot en signal som är ansluten till en skriptslot fungerar på samma sätt. <emphasis>Self.Item(0)</emphasis> är parameter ett och så vidare. Du kan hämta antal argument som skickas via <emphasis>Skriptobjekt.count</emphasis>. </para>
<para>Kommandoradsparametrar tillåter namngivna eller namnlösa argument. Namnlösa ser ut som <screen>kmdr-executor mitt_program.kmdr 100 röd</screen> Här blir _ARG1 = 100 och _ARG2 = röd. En konstighet är att när strängar med mellanslag skickas som argument måste de citeras. Används dialogkommandot blir saker och ting mer komplicerade, eftersom hela argumentsträngen måste skickas som en sträng, alltså inom citationstecken. <screen>dialog("min_dialog.kmdr", 100+" \"Hej allihop\"")</screen> Det returnerar <emphasis>_ARG1 = 100</emphasis> och <emphasis>_ARG2 = Hej allihop</emphasis>. Utan skyddade citationstecken hade du fått <emphasis>_ARG2 = Hej</emphasis> och <emphasis>_ARG3 = allihop</emphasis>. Att använda namngivna parametrar är rätt trevligt, och potentiellt mindre förvirrande. <screen>dialog("min_dialog.kmdr", "xantal=100 xcitat=Hej allihop")</screen> Nu kan du komma åt dem med de globala variablerna <emphasis>_xantal</emphasis> och <emphasis>_xcitat</emphasis>. </para>
<para>Kommandoradsparametrar tillåter namngivna eller namnlösa argument. Namnlösa ser ut som <screen>kmdr-executor mitt_program.kmdr 100 röd</screen> Här blir _ARG1 = 100 och _ARG2 = röd. En konstighet är att när strängar med mellanslag skickas som argument måste de citeras. Används dialogkommandot blir saker och ting mer komplicerade, eftersom hela argumentsträngen måste skickas som en sträng, alltså inom citationstecken. <screen>dialog("min_dialog.kmdr", 100+" \"Hej allihop\"")</screen> Det returnerar <emphasis>_ARG1 = 100</emphasis> och <emphasis>_ARG2 = Hej allihop</emphasis>. Utan skyddade citationstecken hade du fått <emphasis>_ARG2 = Hej</emphasis> och <emphasis>_ARG3 = allihop</emphasis>. Att använda namngivna parametrar är rätt trevligt, och potentiellt mindre förvirrande. <screen>dialog("min_dialog.kmdr", "xantal=100 xcitat=Hej allihop")</screen> Nu kan du komma åt dem med de globala variablerna <emphasis>_xantal</emphasis> och <emphasis>_xcitat</emphasis>. </para>
<para>DCOP kan vara komplicerat, vilket är orsaken till att vi rekommenderar att använda de verktyg vi utvecklar för att göra det möjligt att skapa DCOP för &kommander;-fjärrdialogrutor med något som liknar en funktionsbläddrare. Här är ett exempel på ett DCOP-anrop som skickas från en dialogruta öppnad av ett &kommander;-fönster. Eftersom den vet vem som skapat den, kan den skicka tillbaka information medan den är öppen, och fritt komma åt alla fönstrets funktioner med undantag av slots. Det kan naturligtvis göras internt med ett skript som kan anropas externt, så i praktiken finns det inga begränsningar av vad som är möjligt. <screen>dcop("kmdr-executor-"+parentPid, "KommanderIf", "setText(QString,QString)", "StatusBar8", "Hej")</screen> Låt oss titta på detta en del i taget. Först av allt lägger vi till <emphasis>parentPid</emphasis> to "kmdr-executor-" eftersom vi inte antar att ett &kommander;-fönster gjorde anropet. Du skulle kunna använda det med Quanta, Kspread eller vad som helst. Därefter adresserar vi <emphasis>KommanderIf</emphasis>, som är ett <emphasis>bra</emphasis> gränssnitt för slutanvändare som har städats. Vi hoppas att fler program till sist börjar använda ett bra gränssnitt för integrering när KDE går från DCOP till DBUS i KDE4. Nästa parameter, <emphasis>"setText(QString,QString)"</emphasis>, är viktig eftersom den anger <emphasis>prototyp</emphasis> för tillåtna parametrar. Annars skulle inte &kommander; kunna validera anropet. Utan definitionen av DCOP-anropet som används får du ett fel. Återstående parametrar är förstås de som skickas. Vi rekommenderar att du tittar på program med <command>kdcop</command> för att se hur det fungerar, och övar på att skicka DCOP-anrop från skalet för att få rätt syntax. </para>
<para>DCOP kan vara komplicerat, vilket är orsaken till att vi rekommenderar att använda de verktyg vi utvecklar för att göra det möjligt att skapa DCOP för &kommander;-fjärrdialogrutor med något som liknar en funktionsbläddrare. Här är ett exempel på ett DCOP-anrop som skickas från en dialogruta öppnad av ett &kommander;-fönster. Eftersom den vet vem som skapat den, kan den skicka tillbaka information medan den är öppen, och fritt komma åt alla fönstrets funktioner med undantag av slots. Det kan naturligtvis göras internt med ett skript som kan anropas externt, så i praktiken finns det inga begränsningar av vad som är möjligt. <screen>dcop("kmdr-executor-"+parentPid, "KommanderIf", "setText(TQString,TQString)", "StatusBar8", "Hej")</screen> Låt oss titta på detta en del i taget. Först av allt lägger vi till <emphasis>parentPid</emphasis> to "kmdr-executor-" eftersom vi inte antar att ett &kommander;-fönster gjorde anropet. Du skulle kunna använda det med Quanta, Kspread eller vad som helst. Därefter adresserar vi <emphasis>KommanderIf</emphasis>, som är ett <emphasis>bra</emphasis> gränssnitt för slutanvändare som har städats. Vi hoppas att fler program till sist börjar använda ett bra gränssnitt för integrering när KDE går från DCOP till DBUS i KDE4. Nästa parameter, <emphasis>"setText(TQString,TQString)"</emphasis>, är viktig eftersom den anger <emphasis>prototyp</emphasis> för tillåtna parametrar. Annars skulle inte &kommander; kunna validera anropet. Utan definitionen av DCOP-anropet som används får du ett fel. Återstående parametrar är förstås de som skickas. Vi rekommenderar att du tittar på program med <command>kdcop</command> för att se hur det fungerar, och övar på att skicka DCOP-anrop från skalet för att få rätt syntax. </para>
</sect2>
</sect2>
</sect1>
</sect1>
<!--
<!--
@ -333,7 +333,7 @@ end
<listitem>
<listitem>
<para><command>createWidget(<parameter>komponentnamn</parameter>, <parameter>komponenttyp</parameter>, <parameter>skapare</parameter>)</command> - skapar en ny grafisk komponent. Därefter kan du till exempel lägga till den i en tabell eller verktygslåda, och använda <command>min_komponent.show(true)</command> för att göra den synlig. Om du lägger till en ny grafisk komponent i formuläret, måste du ta hänsyn till layout. &kommander; skapar inte en layout i farten, eller justerar positioner bildpunkt för bildpunkt (i de flesta fall). Det är förvirrande till och med vid utveckling med C++. Vi rekommenderar att du använder en gruppruta och skapar en layout i dialogrutan för att få bäst kontroll. </para></listitem>
<para><command>createWidget(<parameter>komponentnamn</parameter>, <parameter>komponenttyp</parameter>, <parameter>skapare</parameter>)</command> - skapar en ny grafisk komponent. Därefter kan du till exempel lägga till den i en tabell eller verktygslåda, och använda <command>min_komponent.show(true)</command> för att göra den synlig. Om du lägger till en ny grafisk komponent i formuläret, måste du ta hänsyn till layout. &kommander; skapar inte en layout i farten, eller justerar positioner bildpunkt för bildpunkt (i de flesta fall). Det är förvirrande till och med vid utveckling med C++. Vi rekommenderar att du använder en gruppruta och skapar en layout i dialogrutan för att få bäst kontroll. </para></listitem>
<listitem>
<listitem>
<para><command>connect(<parameter>avsändare</parameter>, <parameter>signal</parameter>, <parameter>mottagare</parameter>, <parameter>slot</parameter>)</command> - anslut en signal i en grafisk komponent till en slot. Se anslutningsdialogrutan och välj liknande komponenter för att se möjligheterna. Om en signal till exempel ser ut som <command>execute(const QString&)</command> är det exakt vad som måste finnas här inom citationstecken. </para></listitem>
<para><command>connect(<parameter>avsändare</parameter>, <parameter>signal</parameter>, <parameter>mottagare</parameter>, <parameter>slot</parameter>)</command> - anslut en signal i en grafisk komponent till en slot. Se anslutningsdialogrutan och välj liknande komponenter för att se möjligheterna. Om en signal till exempel ser ut som <command>execute(const TQString&)</command> är det exakt vad som måste finnas här inom citationstecken. </para></listitem>
<listitem>
<listitem>
<para><command>disconnect(<parameter>avsändare</parameter>, <parameter>signal</parameter>, <parameter>mottagare</parameter>, <parameter>slot</parameter>)</command> - ta bort anslutningen som anges ovan. Återigen är exakt riktig syntax helt nödvändig. </para></listitem>
<para><command>disconnect(<parameter>avsändare</parameter>, <parameter>signal</parameter>, <parameter>mottagare</parameter>, <parameter>slot</parameter>)</command> - ta bort anslutningen som anges ovan. Återigen är exakt riktig syntax helt nödvändig. </para></listitem>
<para>En av de många användbara funktionerna som ärvdes av Qt Designer är signaler och slots. Naturligtvis har gränssnittet konstruerats om i ett försök att göra det lämpligt för &kommander;. Signaler och slots hanterar styrning av interna händelser i Qt- och KDE-program. Vi försöker anpassa det så att du inte behöver kunna skillnaden mellan datatyper i C++, men om du använder de nya funktionerna för att skapa anslutningar i farten är det praktiskt att kunna kopiera informationen från anslutningsverktyget. Låt oss ta en titt på vad det betyder. Någonting inträffar i en av dina komponenter. Den kanske tar emot ett klick, ett dubbelklick, får sitt värde ändrat, något markeras, eller en meny begärs. Det är bara några av de möjliga händelser som skulle göra att en signal skickas. Du kanske vill ändra listan i en listruta om en ny markering görs i en kombinationsruta. Det är en användbar funktion i ett avancerat program, och det enda sättet att göra det utan att därefter behöva klicka på en knapp, är att ha en signal ansluten till en slot. En sådan slot kan vara i ett skript eller en knapp. När en signal tas emot ser denna slot till att göra vad den blev ombedd. Det finns ett verktyg för att redigera anslutningarna. Var uppmärksam när du gör detta, eftersom det finns ett stort antal ärvda signaler och slots. Att tala om för ett skript, som är osynligt när dialorgutan körs, att justera sin storlek när du istället ville köra det, får dig säkert att undra vad som hände. </para>
<para>En av de många användbara funktionerna som ärvdes av Qt Designer är signaler och slots. Naturligtvis har gränssnittet konstruerats om i ett försök att göra det lämpligt för &kommander;. Signaler och slots hanterar styrning av interna händelser i Qt- och KDE-program. Vi försöker anpassa det så att du inte behöver kunna skillnaden mellan datatyper i C++, men om du använder de nya funktionerna för att skapa anslutningar i farten är det praktiskt att kunna kopiera informationen från anslutningsverktyget. Låt oss ta en titt på vad det betyder. Någonting inträffar i en av dina komponenter. Den kanske tar emot ett klick, ett dubbelklick, får sitt värde ändrat, något markeras, eller en meny begärs. Det är bara några av de möjliga händelser som skulle göra att en signal skickas. Du kanske vill ändra listan i en listruta om en ny markering görs i en kombinationsruta. Det är en användbar funktion i ett avancerat program, och det enda sättet att göra det utan att därefter behöva klicka på en knapp, är att ha en signal ansluten till en slot. En sådan slot kan vara i ett skript eller en knapp. När en signal tas emot ser denna slot till att göra vad den blev ombedd. Det finns ett verktyg för att redigera anslutningarna. Var uppmärksam när du gör detta, eftersom det finns ett stort antal ärvda signaler och slots. Att tala om för ett skript, som är osynligt när dialorgutan körs, att justera sin storlek när du istället ville köra det, får dig säkert att undra vad som hände. </para>
<para>Du kan öppna anslutningsverktyget genom att högerklicka var som helst i dialogrutan och välja det i menyn. Klicka på menyn så ser du en lista med gjorda anslutningar längst ner. Ovanför visas två listor med signaler och slots, och ovanför dem respektive sändare och mottagare som är vald. Ett enkelt sätt att skapa anslutningar är visuellt. Titta i verktygsraden eller i verktygsmenyn. Där finns tre objekt i en grupp. En pekare, anslutningar av signaler och slots, och flikordningen eller komponenterna. För de nyfikna: att välja den ställer in anslutningsläget. Klicka på komponenten för att skicka signalen och dra den till komponenten som ska ta emot den i en slot. När du gör det ser du en linje och en indikering om var du släpper på komponenten under musen. Editorns statusrad talar om för dig vad som kommer att anslutas. </para>
<para>Du kan öppna anslutningsverktyget genom att högerklicka var som helst i dialogrutan och välja det i menyn. Klicka på menyn så ser du en lista med gjorda anslutningar längst ner. Ovanför visas två listor med signaler och slots, och ovanför dem respektive sändare och mottagare som är vald. Ett enkelt sätt att skapa anslutningar är visuellt. Titta i verktygsraden eller i verktygsmenyn. Där finns tre objekt i en grupp. En pekare, anslutningar av signaler och slots, och flikordningen eller komponenterna. För de nyfikna: att välja den ställer in anslutningsläget. Klicka på komponenten för att skicka signalen och dra den till komponenten som ska ta emot den i en slot. När du gör det ser du en linje och en indikering om var du släpper på komponenten under musen. Editorns statusrad talar om för dig vad som kommer att anslutas. </para>
<note><para>I &kommander; version 1.3 finns funktionen connect() som låter dig ansluta signaler och slots i farten. Det är användbart om du just har använt createWidget. Naturligtvis kan du inte använda dialogrutan för något som &kommander; ännu inte vet existerar. Tyvärr finns det för många kombinationer för att lista, så du måste skriva in signaler och slots. <emphasis>De måste skrivas exakt rätt, annars fungerar de inte.</emphasis> Här är anslutningsverktyget återigen praktiskt. Öppna det och välj två komponenter som motsvarar de du vill ansluta, och läs av anslutningsinformationen. Om den lyder <command>execute(const QString&)</command>, är det exakt vad du måste skriva in.</para></note>
<note><para>I &kommander; version 1.3 finns funktionen connect() som låter dig ansluta signaler och slots i farten. Det är användbart om du just har använt createWidget. Naturligtvis kan du inte använda dialogrutan för något som &kommander; ännu inte vet existerar. Tyvärr finns det för många kombinationer för att lista, så du måste skriva in signaler och slots. <emphasis>De måste skrivas exakt rätt, annars fungerar de inte.</emphasis> Här är anslutningsverktyget återigen praktiskt. Öppna det och välj två komponenter som motsvarar de du vill ansluta, och läs av anslutningsinformationen. Om den lyder <command>execute(const TQString&)</command>, är det exakt vad du måste skriva in.</para></note>