Page 1 of 2

Boite de dialoque avec plusieurs entrées de données

Posted: 14 Aug 2014, 22:41
by Antowoine
Je reviens vers vous pour une autre demande :D :

Je voudrai savoir si il est possible de modifier un peu la fonction entrée de donnée. Je m'explique :

En gros une boite de dialogue du style entrée de données mais avec la possibilité de rentrer plusieurs données (qui vont se stocker dans des variable différentes) dans la même fenêtre.

Je m'explique en image (montage paint ^^)

Image
Ici une seule possibilité de selction par ligne.

Image
Les heures se stockent dans la variable heure et les minutes dans la variable minute :)

Image

Je pense que c'est réalisable avec le code mais j'ai du mal n'ayant pas de connaissances :D

Merci beaucoup de votre future aide !

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 15 Aug 2014, 01:57
by Violette
C'est vrai qu'il manque un tuto sur ce sujet. Ce que tu veux faire demande certaine connaissance en JS. En gros pour ça tu doit utiliser Qt. Voici la liste des classes qui m'a beaucoup aider. Comme tu peux voir la doc est en C++ mais si tu connait le JS tu pourras transposer sans problème, aide toi du débugger pour regarder le détail des propriétés et des méthodes de l'objet désiré pour t'aider. J'ai chercher la doc pour la version JS de Qt, Qt Script sans jamais réussir à tomber dessus, enfin si mais pas de liste de classe avec les détails du coup j'utilise celle du dessus, ce qui n'est pas vraiment fait pour aider un débutant. Ceci dit, si tu as le courage de chercher et que par bonheur tu trouverais, fait moi signe ^^.

Puisse le tout puissant dieu Google être plus clément avec toi dans tes recherches.

Bon je te fait le code pour la première image, comme ça tu auras le code du squelette.

J'ai commenté pas mal je pense donc tu devrais comprendre.

Code: Select all

var selectWindow = new QDialog(); //Créer une boite de dialogue
selectWindow.setWindowTitle(' '); //string - Changer le nom de la fenêtre

var layoutSelectWindow = new QFormLayout(); //Créer un layout
selectWindow.setLayout(layoutSelectWindow); //Attribut le layout à la boite de dialogue

var groupBoxM = new QGroupBox('Choisir la durée en minutes', selectWindow); //Créer un groupe pour les boutons
var radioButtonValueM = ['15', '30', '45']; //Tableau des labels des boutons
var radioButtonM = []; //Tableau vide contenant les futurs objets boutons radio

for (var i = 0; i < radioButtonValueM.length; i++) { 
	radioButtonM[i] = new QRadioButton(radioButtonValueM[i]); //Créer les boutons et les met dans un tableau
}

var hBoxM = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonM.length; i++) {
	hBoxM.addWidget(radioButtonM[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxM.setLayout(hBoxM); //Attribut le layout au groupe de boutons

var groupBoxH = new QGroupBox('Choisir la durée en heures', selectWindow); //Rebelote - Créer un groupe pour les boutons
var radioButtonValueH = ['1', '2', '3', '4', '5']; //Tableau des labels des boutons
var radioButtonH = []; //Tableau vide contenant les futurs objets boutons radio

for (var i = 0; i < radioButtonValueH.length; i++) { 
	radioButtonH[i] = new QRadioButton(radioButtonValueH[i]); //Créer les boutons et les met dans un tableau
}

var hBoxH = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonH.length; i++) {
	hBoxH.addWidget(radioButtonH[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxH.setLayout(hBoxH); //Attribut le layout au groupe de boutons

var buttonBox = new QDialogButtonBox(selectWindow); //Créer une boite pour les boutons
buttonBox.addButton(QDialogButtonBox.Ok);	//Ajout du bouton OK dans la boite
buttonBox.addButton(QDialogButtonBox.Cancel); //Ajout du bouton Annuler dans la boite

layoutSelectWindow.addRow(groupBoxM); //Ajout de la boite au layout
layoutSelectWindow.addRow(groupBoxH); //Ajout de la boite au layout
layoutSelectWindow.addRow(buttonBox); //Ajout de la boite au layout

buttonBox.accepted.connect(selectWindow.accept/*Accepte la boite*/); //Si clique sur OK
buttonBox.rejected.connect(selectWindow.reject/*Ferme la boite*/); //Si clique sur Annuler

if (selectWindow.exec()) { //Si la réponse a été accepté
    for (var i = 0; i < radioButtonM.length; i++) {
		if (radioButtonM[i].checked) //Si le bouton est checké
		Console.print(radioButtonM[i].text); //Récupération de sa valeur
	}
	
	for (var i = 0; i < radioButtonH.length; i++) {
		if (radioButtonH[i].checked) //Si le bouton est checké
		Console.print(radioButtonH[i].text); //Récupération de sa valeur
	}
}

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 15 Aug 2014, 09:19
by Antowoine
Merci beaucoup pour ton aide ! C'est vraiment cool :D

Pour commencer j'ai chercher un peu sur le net avant de poster un message sur le forum, en effet j'ai cherché comment faire des boîte de dialogue en langage C++ ou encore JS. Mais quand je copiais le code dans actionaz, des erreurs de partout :(
http://www.startyourdev.com/javascript/ ... s-dialogue (l'un des sites au cas ou ^^)

Sinon pour ton script, j'ai presque tout compris (bon a part le truc des layouts la x) ), c'est parfait les réponses se stockent dans deux variable différentes, merci :)

En tout cas je sais pas si c'est possible mais je pense qu'ajouter cette fonctionnalité a actionaz, sa serait intéressant :D

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 15 Aug 2014, 12:52
by Jmgr
Je pense que c'est réalisable avec le code mais j'ai du mal n'ayant pas de connaissances :D
Ce n'est pas possible avec l'action Entrée de données, mais avec du code Javascript/Ecmascript.
C'est vrai qu'il manque un tuto sur ce sujet. Ce que tu veux faire demande certaine connaissance en JS. En gros pour ça tu doit utiliser Qt. Voici la liste des classes qui m'a beaucoup aider. Comme tu peux voir la doc est en C++ mais si tu connait le JS tu pourras transposer sans problème, aide toi du débugger pour regarder le détail des propriétés et des méthodes de l'objet désiré pour t'aider. J'ai chercher la doc pour la version JS de Qt, Qt Script sans jamais réussir à tomber dessus, enfin si mais pas de liste de classe avec les détails du coup j'utilise celle du dessus, ce qui n'est pas vraiment fait pour aider un débutant. Ceci dit, si tu as le courage de chercher et que par bonheur tu trouverais, fait moi signe ^^.
Il n'y a pas de documentation sur la version Javascript des classes de Qt, c'est un peu dommage mais ceux qui développent Qt et QtScript n'en proposent pas. Mais d'un autre côté vu qu'il y a plusieurs milliers de classes dans Qt c'est un travail de titan. Néanmoins tu peux déduire le nom des objets Javascript et le nom des fonctions à partir de la documentation pour le C++, mais ça implique de connaître un minimum ce langage.
Pour commencer j'ai chercher un peu sur le net avant de poster un message sur le forum, en effet j'ai cherché comment faire des boîte de dialogue en langage C++ ou encore JS. Mais quand je copiais le code dans actionaz, des erreurs de partout :(
http://www.startyourdev.com/javascript/ ... s-dialogue (l'un des sites au cas ou ^^)
Actionaz ne te permet pas d'intégrer du code C++ dans une action, uniquement du Javascript. Par contre si tu veux modifier le logiciel alors il te faudra utiliser du C++.
La page web que tu donnes propose du code Javascript pour le Web qui intègrent des objets spécifiques au Web et qui ne sont donc pas utilisables avec Actionaz.
En informatique on distingue normalement le langage de l'API (interface de programmation). Le langage c'est la syntaxe, la grammaire et des fonctions intégrées. L'API dans le cas du Web, ce sont par exemple les objets "document" et "window". Dans le cas d'Actionaz, l'API est disponible sur cette page : http://wiki.actionaz.org/doku.php?id=fr:code + l'API de Qt : http://qt-project.org/doc/qt-4.8/classes.html

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 15 Aug 2014, 22:04
by Antowoine
Salut,

Merci jmgr pour tes explications, c'est vraiment sympa de vouloir aider ceux qui comprennent rien au JS :).

Pour ce qui est du wiki, je l'ai déjà consulté mais tu viens de me faire découvrir une page qui m'aidera beaucoup plus tard :D

Sinon pour revenir a nos moutons,
Je ne sais pas si tu pense qu'ajouter la possibilité de faire des boîtes de dialogue avec plusieurs champs de saisie dans un prochaine version d'actionaz serait intéressant.
Sinon j'ai aussi pensé, es possible de rajouter une option pour que la case Ok soit "grisée" (inutilisable) tant qu'aucune possibilité n'ai été choisie.

J'ai testé ton code Violette il m'indique une erreur sur Qdialogue :(

Voilà merci encore pour votre aide ^^

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 16 Aug 2014, 17:09
by Violette
Je peux avoir plus de détail stp ? Un screen ?

Code: Select all

var selectWindow = new QDialog(); //Créer une boite de dialogue
selectWindow.setWindowTitle(' '); //string - Changer le nom de la fenêtre

var layoutSelectWindow = new QFormLayout(); //Créer un layout
selectWindow.setLayout(layoutSelectWindow); //Attribut le layout à la boite de dialogue

var groupBoxM = new QGroupBox('Choisir la durée en minutes', selectWindow); //Créer un groupe pour les boutons
var radioButtonValueM = ['15', '30', '45']; //Tableau des labels des boutons
var radioButtonM = []; //Tableau vide contenant les futurs objets boutons radio

function blockedButton() {
var j = 0;
	for (var i = 0; i < radioButtonM.length; i++) {
		if (radioButtonM[i].checked) //Si le bouton est checké
			j++; //Incrémente j de 1
	}
	
	for (var i = 0; i < radioButtonH.length; i++) {
		if (radioButtonH[i].checked) //Si le bouton est checké
			j++; //Incrémente j de 1
	}
	if (j === 2) //Donc les 2 séries de boutons radio sont checkée
		buttonBox.button(QDialogButtonBox.Ok).setDisabled(false);
}

for (var i = 0; i < radioButtonValueM.length; i++) { 
	radioButtonM[i] = new QRadioButton(radioButtonValueM[i]); //Créer les boutons et les met dans un tableau
	radioButtonM[i].toggled.connect(blockedButton); //Ajoute un signal pour demander d'executer la fonction blockedButton a chaque fois qu'un bouton du groupe a été cliqué
}

var hBoxM = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonM.length; i++) {
	hBoxM.addWidget(radioButtonM[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxM.setLayout(hBoxM); //Attribut le layout au groupe de boutons

var groupBoxH = new QGroupBox('Choisir la durée en heures', selectWindow); //Rebelote - Créer un groupe pour les boutons
var radioButtonValueH = ['1', '2', '3', '4', '5']; //Tableau des labels des boutons
var radioButtonH = []; //Tableau vide contenant les futurs objets boutons radio

for (var i = 0; i < radioButtonValueH.length; i++) { 
	radioButtonH[i] = new QRadioButton(radioButtonValueH[i]); //Créer les boutons et les met dans un tableau
	radioButtonH[i].toggled.connect(blockedButton); //Ajoute un signal pour demander d'executer la fonction blockedButton a chaque fois qu'un bouton du groupe a été cliqué
}

var hBoxH = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonH.length; i++) {
	hBoxH.addWidget(radioButtonH[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxH.setLayout(hBoxH); //Attribut le layout au groupe de boutons

var buttonBox = new QDialogButtonBox(selectWindow); //Créer une boite pour les boutons
buttonBox.addButton(QDialogButtonBox.Ok); //Ajout du bouton OK dans la boite
buttonBox.button(QDialogButtonBox.Ok).setDisabled(true); //Selectionne le bouton Ok et le grise
buttonBox.addButton(QDialogButtonBox.Cancel); //Ajout du bouton Annuler dans la boite

layoutSelectWindow.addRow(groupBoxM); //Ajout de la boite au layout
layoutSelectWindow.addRow(groupBoxH); //Ajout de la boite au layout
layoutSelectWindow.addRow(buttonBox); //Ajout de la boite au layout

buttonBox.accepted.connect(selectWindow.accept/*Accepte la boite*/); //Si clique sur OK
buttonBox.rejected.connect(selectWindow.reject/*Ferme la boite*/); //Si clique sur Annuler

if (selectWindow.exec()) { //Si la réponse a été accepté
    for (var i = 0; i < radioButtonM.length; i++) {
		if (radioButtonM[i].checked) //Si le bouton est checké
		Console.print(radioButtonM[i].text); //Récupération de sa valeur
	}
	
	for (var i = 0; i < radioButtonH.length; i++) {
		if (radioButtonH[i].checked) //Si le bouton est checké
		Console.print(radioButtonH[i].text); //Récupération de sa valeur
	}
}
J'ai rajouter le code pour que le bouton se grise ainsi que les commentaires.
En tout cas moi ça marche mais si ya une erreur sur ton pc ça m'intéresse de savoir pourquoi.

Gif_Its_Work

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 16 Aug 2014, 17:41
by Jmgr
Je ne sais pas si tu pense qu'ajouter la possibilité de faire des boîtes de dialogue avec plusieurs champs de saisie dans un prochaine version d'actionaz serait intéressant.
Hm. C'est un peu compliqué à rendre intuitif. Combien d'entrées permet-on au maximum ? Comment l'afficher dans la fenêtre de configuration ? Comment gérer le fait que l'on veut parfois que tous les paramètres soient remplis et parfois seulement certains d'entre eux ?
Je pense que lorsqu'on doit demander plusieurs choix à la suite on peut tout à fait utiliser plusieurs fenêtres, ce n'est peut-être pas aussi élégant mais ça fonctionne également.
Sinon j'ai aussi pensé, es possible de rajouter une option pour que la case Ok soit "grisée" (inutilisable) tant qu'aucune possibilité n'ai été choisie.
Oui, bonne idée. Merci.

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 16 Aug 2014, 21:53
by Antowoine
En fait tout les codes que j'ai essayé ne marchent pas sur mon ordi (code du wiki, ou encore code du forum) en gros mon ordi effectue le script comme si les actions que j'ai rentré avec la fonction code n'existent pas (en gros il le passe sans rien faire)

Violette dit moi ce que je dois te donner pour que tu comprenne ce qui ne va pas

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 16 Aug 2014, 21:53
by Antowoine
En fait tout les codes que j'ai essayé ne marchent pas sur mon ordi (code du wiki, ou encore code du forum) en gros mon ordi effectue le script comme si les actions que j'ai rentré avec la fonction code n'existent pas (en gros il le passe sans rien faire)

Violette dit moi ce que je dois te donner pour que tu comprenne ce qui ne va pas :)

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 16 Aug 2014, 22:55
by Jmgr
As-tu bien mis le paramètre où tu as entré le code en mode "code" ? C'est le triangle rouge. Par défaut tout texte est considéré comme du texte brut, pas comme du Javascript.

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 17 Aug 2014, 07:25
by Antowoine
Oui oui le triangle rouge apparaît bien. Par contre j'ai désactivé l'option "vérifier automatiquement la syntaxe"

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 17 Aug 2014, 11:28
by Jmgr
Par contre j'ai désactivé l'option "vérifier automatiquement la syntaxe"
Pourquoi ?

Peux-tu poster le contenu d'un script reproduisant le problème ? (Fichier->Exporter->Contenu du script, entre deux balises code)

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 19 Aug 2014, 22:12
by Antowoine
Salut,

Pour commencer j'ai celui ci (rien ne se passe quand je l’exécute)

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<scriptfile>
    <settings program="actionaz" version="3.8.0" scriptVersion="1.1.0" os="Windows"/>
    <actions>
        <action name="ActionMessageBox" version="1.0.0"/>
        <action name="ActionCode" version="1.0.0"/>
    </actions>
    <parameters/>
    <resources/>
    <script pauseBefore="0" pauseAfter="0">
        <action name="ActionCode">
            <exception id="0" action="0" line=""/>
            <exception id="1" action="0" line=""/>
            <exception id="2" action="1" line=""/>
            <parameter name="code">
                <subParameter name="value" code="1">var selectWindow = new QDialog(); //Créer une boite de dialogue
selectWindow.setWindowTitle(' '); //string - Changer le nom de la fenêtre

var layoutSelectWindow = new QFormLayout(); //Créer un layout
selectWindow.setLayout(layoutSelectWindow); //Attribut le layout à la boite de dialogue

var groupBoxM = new QGroupBox('Choisir la durée en minutes', selectWindow); //Créer un groupe pour les boutons
var radioButtonValueM = ['15', '30', '45']; //Tableau des labels des boutons
var radioButtonM = []; //Tableau vide contenant les futurs objets boutons radio

for (var i = 0; i < radioButtonValueM.length; i++) { 
   radioButtonM[i] = new QRadioButton(radioButtonValueM[i]); //Créer les boutons et les met dans un tableau
}

var hBoxM = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonM.length; i++) {
   hBoxM.addWidget(radioButtonM[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxM.setLayout(hBoxM); //Attribut le layout au groupe de boutons

var groupBoxH = new QGroupBox('Choisir la durée en heures', selectWindow); //Rebelote - Créer un groupe pour les boutons
var radioButtonValueH = ['1', '2', '3', '4', '5']; //Tableau des labels des boutons
var radioButtonH = []; //Tableau vide contenant les futurs objets boutons radio

for (var i = 0; i < radioButtonValueH.length; i++) { 
   radioButtonH[i] = new QRadioButton(radioButtonValueH[i]); //Créer les boutons et les met dans un tableau
}

var hBoxH = new QHBoxLayout; //Créer un layout horizontal
for (var i = 0; i < radioButtonH.length; i++) {
   hBoxH.addWidget(radioButtonH[i], 0, 0); //Rajoute les boutons au layout
}
groupBoxH.setLayout(hBoxH); //Attribut le layout au groupe de boutons

var buttonBox = new QDialogButtonBox(selectWindow); //Créer une boite pour les boutons
buttonBox.addButton(QDialogButtonBox.Ok);   //Ajout du bouton OK dans la boite
buttonBox.addButton(QDialogButtonBox.Cancel); //Ajout du bouton Annuler dans la boite

layoutSelectWindow.addRow(groupBoxM); //Ajout de la boite au layout
layoutSelectWindow.addRow(groupBoxH); //Ajout de la boite au layout
layoutSelectWindow.addRow(buttonBox); //Ajout de la boite au layout

buttonBox.accepted.connect(selectWindow.accept/*Accepte la boite*/); //Si clique sur OK
buttonBox.rejected.connect(selectWindow.reject/*Ferme la boite*/); //Si clique sur Annuler

if (selectWindow.exec()) { //Si la réponse a été accepté
    for (var i = 0; i < radioButtonM.length; i++) {
      if (radioButtonM[i].checked) //Si le bouton est checké
      Console.print(radioButtonM[i].text); //Récupération de sa valeur
   }
   
   for (var i = 0; i < radioButtonH.length; i++) {
      if (radioButtonH[i].checked) //Si le bouton est checké
      Console.print(radioButtonH[i].text); //Récupération de sa valeur
   }
}</subParameter>
            </parameter>
        </action>
        <action name="ActionMessageBox">
            <exception id="0" action="0" line=""/>
            <exception id="1" action="0" line=""/>
            <exception id="2" action="1" line=""/>
            <parameter name="windowIcon">
                <subParameter name="value" code="0"></subParameter>
            </parameter>
            <parameter name="message">
                <subParameter name="value" code="0">Vous avez choisis $radioButtonH h $radioButtonM min</subParameter>
            </parameter>
            <parameter name="title">
                <subParameter name="value" code="0"></subParameter>
            </parameter>
            <parameter name="textMode">
                <subParameter name="value" code="0">automatic</subParameter>
            </parameter>
            <parameter name="ifYes">
                <subParameter name="line" code="0"></subParameter>
                <subParameter name="action" code="0">do_nothing</subParameter>
            </parameter>
            <parameter name="customIcon">
                <subParameter name="value" code="0"></subParameter>
            </parameter>
            <parameter name="icon">
                <subParameter name="value" code="0">none</subParameter>
            </parameter>
            <parameter name="type">
                <subParameter name="value" code="0">ok</subParameter>
            </parameter>
            <parameter name="ifNo">
                <subParameter name="line" code="0"></subParameter>
                <subParameter name="action" code="0">do_nothing</subParameter>
            </parameter>
        </action>
    </script>
</scriptfile>
Et puis j'ai celui-ci aussi

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<scriptfile>
    <settings program="actionaz" version="3.8.0" scriptVersion="1.1.0" os="Windows"/>
    <actions>
        <action name="ActionCode" version="1.0.0"/>
    </actions>
    <parameters/>
    <resources/>
    <script pauseBefore="0" pauseAfter="0">
        <action name="ActionCode">
            <exception id="0" action="0" line=""/>
            <exception id="1" action="0" line=""/>
            <exception id="2" action="1" line=""/>
            <parameter name="code">
                <subParameter name="value" code="1">var myObject = new MessageBox({
    title: "Press yes or no",
    icon: MessageBox.Warning,
    buttons: MessageBox.Yes | MessageBox.No
});</subParameter>
            </parameter>
        </action>
    </script>
</scriptfile>
Voila je sais pas si ca viens de mon PC, de actionaz ou des scripts :(

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 19 Aug 2014, 22:54
by Violette
Hum tu as testé le script comment ? Car j'ai remarqué une chose, quand tu veux exécuter une archive sfx, si tu as coché la case Utiliser les binaires 32 bits alors que ton os est en 64 bits, tu obtient ladite erreur.

Re: Boite de dialoque avec plusieurs entrées de données

Posted: 19 Aug 2014, 23:42
by Antowoine
Effectivement, mon PC est un 64 bits mais je n'ai rien coché et je trouve vraiment bizarre que je n'arrive pas utiliser ton script :(