Journal [Qt et Slots] Help !

Posté par  (site web personnel) .
Étiquettes : aucune
0
22
avr.
2004
Bonsoir journal,

Je fais appel à toi pour un problème de programmation en Qt.
Je suis en train de me remettre un petit peu au développement de Konq Rellinks ( http://shift.freezope.org/konq_rellinks/(...) ) mais j'ai un problème pour associer un slot à un item d'un KToolBarPopupAction ( http://developer.kde.org/documentation/library/cvs-api/kdeui/html/c(...) )

J'ai en effet une fonction ayant la signature suivante :

/**
* Go to the link
* @param rel Relation name
* @param id Identifier of the menu item
*/
void goToLink(const QString & rel, int id=-1);


Et j'aimerais pouvoir utiliser comme slot cette fonction avec le paramètre "rel" déjà défini dans le genre :

connect( kactionmenu_map[lrel]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goToLink( "ma_relation", int ) ) );

Mais ce n'est pas possible à ma connaissance :(

Comment faire sachant que je ne peut pas crééer de fonction pour chaque relation à moins de perdre la souplesse de mon plugin ?
C'est à dire que faire ce qui suit pour chaque relation m'ait impossible.

void RelLinksPlugin::goSearch() {
goToLink("search");
}


Peut-on créer des slots "à chaud" ?

Merci cher journal pour ton aide,

Franck

PS : D'ailleurs si tu as envie de m'aider pour mon plugin cher journal, tu es le bienvenue :)
  • # Re: [Qt et Slots] Help !

    Posté par  (site web personnel) . Évalué à 2.

    d'après ce que je crois comprendre, le nom de la relation et l'id de menu sont liées (je vois bien un item "search" par exemple), donc pourquoi mettre les 2 en paramètre? (j'imagine que rel == kactionmenu_map[lrel]->popupMenu()->text(id) ou approchant, quitte à passer par une map ou autre)
    auquel cas un

    slot void goToLink(int id=-1);
    connect( kactionmenu_map[lrel]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goToLink( int ) ) );

    serait suffisant.
    Le seul cas (que je vois) pour lequel les 2 seraient effectivement indépendants, c'est un appel d'une meme relation qui peut "bouger" dans le menu sans modifier le nom des items eux-mêmes (ce qui est sacrément vicieux, et à mon avis pas très user-friendly :))


    ou alors pourquoi pas quelque chose du genre :

    public slots:
    void slotGoToLinkById(int id) {
    QPopupMenu * menu = dynamic_cast<QPopupMenu *>(sender());
    if(menu) {
    gotoLink(menu->text(id),id);
    }
    }

    et

    connect( kactionmenu_map[lrel]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( slotGoToLinkById( int ) ) );

    de toute manière, faire un slot avec un argument statique serait contre-performant (puisque ça rend ton code... statique) et le créer dynamiquement est peut-être possible (sans doute, puisque rien n'est vérifié avant exécution) en bricolant le code des meta-objets à la main, mais de base je ne crois pas: en tout état de cause, ça serait un massacre au niveau du nombre de connexions et slots, et donc des performances de l'application
    • [^] # Re: [Qt et Slots] Help !

      Posté par  (site web personnel) . Évalué à 1.

      d'après ce que je crois comprendre, le nom de la relation et l'id de menu sont liées (je vois bien un item "search" par exemple), donc pourquoi mettre les 2 en paramètre? (j'imagine que rel == kactionmenu_map[lrel]->popupMenu()->text(id) ou approchant, quitte à passer par une map ou autre)
      auquel cas un


      Non.

      En fait pour t'expliquer rapidos, kactionmenu_map[] représente tous les menus de la toolbar de Konq Rellinks. Il y a (ou y aura) un sous-menu par type de relation. Les relations étant celles définies dans les balises <link... > de la page-web.

      Pourquoi des menus ? En fait parce que la norme n'interdit pas d'avoir 2 relations similaires ("up", "author", "section",...)
      Quant au texte des items du menu il correspond au title de la balise link (et donc pas à rel). Il n'y a donc aucun lien entre rel et kactionmenu_map[lrel]->popupMenu()->text(id)

      Ce qui explique pourquoi j'ai besoin de 2 paramètres à la méthode goToLink.

      Sinon il me faut créer un slot par type de relation. Le problème est que la norme ne limite pas le nom des relations donc cette méthode ferait que je ne pourrais pas supporter les relations que je n'aurais pas mis en dur dans le code :(

      Bref je suis coincé (pan !).

      Cela dit je ne connaissais pas la possibilité d'accéder aux infos du sender(). En fait il faudrait que je puisse mettre le nom de la relation (rel) dans ce sender donc dans le QPopupMenu :(

      L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

  • # Re: [Qt et Slots] Help !

    Posté par  . Évalué à 1.

    Qu'est ce qui t'empeche de faire un truc du style :


    class GoToLinkWrapper {
    Q_OBJECT
    private :
    RelLinksPlugin *instance_;
    QString rel_;

    public :
    GoToLinkWrapper(RelLinksPlugin *instance, const QString& rel) : instance_(instance), rel_(rel) {}

    public slot :
    void goToLink(int id) { instance_->goToLink(rel_, id); }
    };

    GoToLinkWrapper *wrapper = new GoToLinkWrapper(this, "ma_relation");
    connect( kactionmenu_map[lrel]->popupMenu(), SIGNAL( activated( int ) ), wrapper, SLOT( goToLink( int ) ) );


    Bref, on pourrait appeller ca une closure ... :-)
    • [^] # Re: [Qt et Slots] Help !

      Posté par  (site web personnel) . Évalué à 1.

      Pas con du tout ça !!!!!!!
      J'avais pas pensé qu'on pouvait influencer sur l'instance sur lequel est lancé le slot.

      Je vais tester ça ce soir \o/

      L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

    • [^] # Correction

      Posté par  (site web personnel) . Évalué à 1.

      class GoToLinkWrapper : public QObject {
      ....

      L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

  • # Re: [Qt et Slots] Help !

    Posté par  (site web personnel) . Évalué à 1.

    Je t' invite à regarder aussi du coté de QObject::sender()

    il y a moyen d'obtenir le nom de l'objet qui envoi le signal (avec sender()->name() )

    ou alors tu fais une QMap<QObject*, QString> que tu remplis au moment de la confection, et un appel vers map[sender()] dans ta fonction.
    • [^] # Re: [Qt et Slots] Help !

      Posté par  (site web personnel) . Évalué à 1.

      Je peux même utiliser setProperty pour ajouter des propriétés à mon sender() ?

      L'association LinuxFr ne saurait être tenue responsable des propos légalement repréhensibles ou faisant allusion à l'évêque de Rome, au chef de l'Église catholique romaine ou au chef temporel de l'État du Vatican et se trouvant dans ce commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.