thread et GUI [QT] - C++ - Programmation
Marsh Posté le 11-06-2012 à 18:28:25
l'interface graphique DOIT être mise à jour par le thread principal. Aucune autre solution et pas moyen de contourner le problème.
C'est la partie en dessous que tu peux threader.
Marsh Posté le 11-06-2012 à 18:54:28
Je suis parfaitement d'accord mais la je ne souhaite pas mettre à jour mais bien lancer une nouvelle fenêtre, avec un autre .ui.
Ce n'est pas possible non plus?
Marsh Posté le 11-06-2012 à 19:15:09
link953 a écrit : Je suis parfaitement d'accord mais la je ne souhaite pas mettre à jour mais bien lancer une nouvelle fenêtre, avec un autre .ui. |
le .ui c'est juste un fichier xml qui décrit tes widgets, qui sont alors écrits en c++
Si si, tu peux ouvrir toutes les fenetres que tu veux, mais dans le thread principal
Marsh Posté le 12-06-2012 à 08:33:09
Autre petite question,
Qt propose donc de la programmation événementiel. Une while(1) ( bien pratique en C), n'est donc plus de mise je pense non comment la remplacer "proprement", avec le système de SLOT et CONNECT?
Et est-ce pour cela que j'ai une beau : QThread: Destroyed while thread is still running en quittant mon programme?
voici le code du thread:
Code :
|
Merci
Marsh Posté le 12-06-2012 à 10:42:00
Tu as bien instancié une QApplication dans ton main? si tu ne le fais pas, tu as ce message.
Sinon le terminate() ils disent bien qu'il faut éviter
Marsh Posté le 12-06-2012 à 10:44:06
Oui le terminate est mauvais. j'ai chercher de mon coté, et j'ai remplacer ma while(1) par une while avec une variable boolean mais même erreur.
Qu'entends-tu par le QApplication?
Code :
|
Tu parles de ça?
Marsh Posté le 12-06-2012 à 10:51:20
ouais je pensais à ça.
C'est ton mainwindow qui instancie le ThreadAccept?
Si tu fais
Code :
|
ça le fait aussi?
Marsh Posté le 12-06-2012 à 11:31:52
Oui c'est mainwindow.
Je n'ia pas reussi avec ce que tu m'a dis.
Peut être si je poste mon code sa te sera plus clair?
Marsh Posté le 12-06-2012 à 11:40:04
ouais, un ensemble qui compile? Je promets rien, mais je peux jouer avec
Marsh Posté le 12-06-2012 à 11:47:22
Oui sa compile, mais je te préviens il est loin d'être optimisé, ( ni même élégant).
C'est une adaptation d'un programme qui fonction avec une interface graphique mais c'est un projet perso alors bon.. bref voila le code.
http://www.toofiles.com/fr/oip/doc [...] chive.html
Marsh Posté le 12-06-2012 à 11:56:15
l'ideal serait de greffer le fichier ThreadFichier.ui sur le thread écrit dans ThreadFichier.cpp
Marsh Posté le 12-06-2012 à 12:28:34
pardon
vire le exec() du run() si tu n'as pas besoin de la gestion des events, ou ajoute un thread->quit() dans le destructeur de ton mainwindow (ou plutot dans la partie qui arrete le serveur, que tu peux appeler si besoin dans le destructeur de ton mainwindow)
Marsh Posté le 12-06-2012 à 14:01:43
T'es mon sauveur, j'ai enlevé exec(); et j'ai plus d'érreur. Penses-tu que c'est la meilleurs solution?
Marsh Posté le 12-06-2012 à 14:50:50
link953 a écrit : T'es mon sauveur, j'ai enlevé exec(); et j'ai plus d'érreur. Penses-tu que c'est la meilleurs solution? |
J'en sais rien...
Regarde du coté du module QtNetwork aussi. Il y a tout ce qu'il te faut.
Marsh Posté le 12-06-2012 à 15:53:49
oui je sais mais pour l'instant je préfére me debrouillé avec les thread, c'est déjà du mal...
Marsh Posté le 13-06-2012 à 16:55:51
Salut! Dernière question apres je t'embête plus.
J'ai deux .ui, le premier est mis directement lors du lancement du projet, le deuxième vient d'être créer mais je ne sais pas comment le lancé.
Marsh Posté le 13-06-2012 à 17:15:42
link953 a écrit : Salut! Dernière question apres je t'embête plus. |
En fait l'idée de base c'est de créer ton ui, et de créer la classe qui en dérive et que tu utilises.
Dans ton .pro, tu rajoutes
FORMS += monUi.ui
Après tu crées deux fichiers, et tu les ajoutes dans ton .pro
SOURCES += uiDerivee.cpp
HEADERS += uiDerivee.h
et tu codes ta classe
class uiDerivee : public Ui::monUi
{
Q_OBJECT
et tout ce que tu veux dedans
}
et quand tu en as besoin, tu instancies ta classe et tu appelles show() dessus
edit. la méthode que tu as utilisée, doit marcher aussi. Mais j'ai appris à faire comme ça.Mais ça devait pas être ça ton problème
Marsh Posté le 13-06-2012 à 21:00:30
ReplyMarsh Posté le 13-06-2012 à 21:32:07
link953 a écrit : Pourtant j'ai essayé ça et pas de resultat concluant... |
quoi donc?
Code :
|
ne fait rien?
dans le constructeur de ta class uiDerivee, tu as bien un
Code :
|
?
également, je crois qu'il faut que ta classe uiDerivee dérive de QWidget
class uiDerivee : public QWidget, public Ui::monUi
{
...
};
Marsh Posté le 13-06-2012 à 22:00:05
Yep j'ai essayer tout ça, c'est donc que j'ai du merder quelque part je vais chercher dans mon code je te tiens au courant demain je pense.
En tout cas merci infiniment de ton aide!
Marsh Posté le 14-06-2012 à 17:39:10
Bon j'ai essayer tout un tas de chose je m'en sort pas. J'ai réussi niveau fonction a faire ce que je veux mais pas niveau graphique.
Est ce que tu pourrais me filer un coup de main?
Marsh Posté le 14-06-2012 à 18:14:33
oui si tu veux
C'est là où je comprends pas, parce dans le code que tu avais posté, ton "a propos de l'application" et "a propos de qt" fonctionnent.
Qu'est-ce que tu veux que je fasse?
attends bouge pas je vais te faire un truc avec deux ui. Je te poste ça ce soir
Marsh Posté le 14-06-2012 à 19:41:57
Bon j'ai repris ton zip.
Dans ton mainwindow j'ai rajouté un bouton "pouet" qui t'ouvre une fenetre modale en cliquant dessus. J'ai pas changé ton ancien code
http://www.toofiles.com/fr/oip/doc [...] modif.html
Marsh Posté le 14-06-2012 à 20:49:31
Ok super. T'es un chef merci infiniment. Je vais bosser ça. Je ne ferme pas le topic au cas ou ...
Marsh Posté le 16-06-2012 à 00:13:45
Je dois vraiment être nul, j'ai compris comment lancer la nouvelle fenêtre mais je n'arrive pas à modifier les labels ou la progresse par que j'ai mis dedans.
Marsh Posté le 16-06-2012 à 07:15:23
Dans l'exemple que je t'ai fait, je n'ai pas procédé par aggrégation (comme toi avec tes Ui::MainWindow *ui; et Ui::MainWindow *up;), mais par dérivation de la classe mère, donc tout est accessible directement:
myLabel->setText("hello" );
myProgressBar->setValue(10);
Marsh Posté le 16-06-2012 à 11:35:21
Je confirme je suis vraiment nul, j'ai vraiment du mal avec le c++. Encore une fois merci à toi.
Marsh Posté le 17-06-2012 à 15:17:44
Alors j'ai un dernier petit souci. J'essai d'envoyer un signal depuis mon thread ThreadFichier et de le recevoir dans monFichier.cpp (qui gére l'interface graphique)
Je pense que sa vient d'un problèmes de parent.
Mon probleme c'est que j'emet un signal que je tente de récuperer dans un slot mais rien ne se passe. Même quand je met qAPP et le slot qui(); rien ne se passe.
Marsh Posté le 17-06-2012 à 15:48:29
Je vois hmmmmmm
rien
A l'exécution, il te dit même pas que ton slot existe pas?
T'as connecté comment? où?
Marsh Posté le 17-06-2012 à 16:05:04
La compil' et l'execution RAS. j'ai connecté un signal émit dans le thread qui gére la reception du fichier a un slot dans la classe que tu avais faite myPouet.
Marsh Posté le 17-06-2012 à 16:09:57
link953 a écrit : La compil' et l'execution RAS. j'ai connecté un signal émit dans le thread qui gére la reception du fichier a un slot dans la classe que tu avais faite myPouet. |
comment t'as écrit le code? A quel endroit? Si je pense à ce que je pense, les pointeurs que tu passes à connect sont-ils non nuls?
quelle version de Qt?
Marsh Posté le 17-06-2012 à 17:59:46
antiseptiqueincolore a écrit : |
Alors voci les codes:
ThreadFichier.hpp
Code :
|
Le .cpp
Code :
|
monFichier.h:
Code :
|
Code :
|
J'essai de d'envoyer depuis le Threadfichier la taille max que je recois de ma socket vers MonFichier pour initialiser une progresse bar avec Qt 4.7.4
Marsh Posté le 17-06-2012 à 18:01:10
J'ai tester avec un qDebug pour voir si j'arrivais correctement dans le slot mais non rien ne s'affiche.
Marsh Posté le 17-06-2012 à 19:08:55
Pourtant si, je fais appel à ce thread dans une autre classe. La dessus aucun doute il est executer puisque je revois bien mon fichier.
Marsh Posté le 17-06-2012 à 19:26:35
alors bytecount ne vaut pas -1 alors
Marsh Posté le 11-06-2012 à 17:39:01
Salut tout le monde,
Voila j'ai plusieurs questions, je galére sur un truc. JE débute sous QT et je transforme un serveur de fichier que j'ai codé en c en serveur ( pareil donc ) mais avec interface graphique.
Est-ce possible avec Qt de greffer un fichier .ui sur un thread et aussi est-ce possible de lancer un thread à partir d'un autre thread?
Je vais avoir besoin d'un sacré coup de main.
Si besoin je poste mon code.
Merci les amis!