Les derniers messages du forum QtFR.

18/12/2016

Archivage // desarchivage

Bonjour,

Existe-il un moyen sous Qt de regrouper des fichiers dans un seul fichier puis inversement.
Je ne parle pas compression, juste de rassembler des fichiers dans un seul fichier.

Sinon, est-il possible d'associer très facilement un outil de compression decompression avec Qt ?

Merci d'avance.


24/03/2017

QTreeView : éléments sélectionnables uniquement s'ils ont le même parent

Bonjour

J'ai dérivé une classe QTreeView afin de mettre la sélection d'éléments uniquement s'ils ont le même parent.

Dans le comportement normal d'une sélection, en se positionnant sur un élément (élément A) sans appuyer sur SHIFT, puis en se déplaçant en maintenant SHIFT enfoncé, les éléments nouveaux se sélectionnent, et si l'on revient en arrière, l'élément courant précédent se désélectionne. En gros, tous les éléments entre A et l'élément courant sont sélectionnés (et uniquement eux).

Dans mon code, ce comportement opère bien, mais dès que mon élément courant sort des limites que j'ai fixées, j'obtiens ensuite n'importe quoi. La sélection reste telle quelle. Lorsque mon élément courant revient vers A, tout ce qui est entre cet élément A et le dernier élément du parent reste sélectionné.

J'ai remarqué, en analysant
selectionModel()->selection()
, que je me retrouve avec une multitude de
QItemSelectionRange
, chacun ayant le même parent que les autres. Je me demande si ce n'est pas ça qui fait foirer le comportement de mes sélections.
Car lorsque je n'interdit pas les sélections d'éléments n'ayant pas le même parent, les
QItemSelectionRange
sont bien classés par parents différents.

Comment résoudre ça ? Est-ce un bug de Qt ? Comment, après chaque nouvel élément sélectionné, obliger Qt à réorganiser proprement son
QItemSelection
?

Je ne sais pas si je me fais bien comprendre. Ce n'est pas évident d'expliquer par écrit.
29/12/2016
21/03/2017

[Qt+OpenCV]Format QImage avec conversion cv::Mat to QImage

Bonjour à tous,

J'ai un peu de mal avec les conversions entre des cv::Mat et des QImage.

Pour faire simple je charge et affiche une image de type QImage (là dessus pas de soucis)

Ensuite j'ai une classe ou je récupère mon image qui est chargé que je veux modifier.

void ClasseImg::setImage(const QImage &imageInitiale){

//img est de type QImage
img=imageInitiale;

//mImg est de type cv::Mat içi je fais la conversion
mImg=cv::Mat(cv::Mat(img.height(),img.width(),CV_8UC4,(uchar*)img.bits(),img.bytesPerLine()));

if(mImg.channels()==3){

if(mImg.type()==CV_8UC4){

mImg.convertTo(mImg,CV_32F,1./255.0);
}
}
else if(mImg.channels()==1){

if(mImg.type()==CV_8UC4){

mImg.convertTo(mImg,CV_32F,1./255.0);
}
}

}
Grâce au code ci dessous je me retrouve avec des matrices cv::Mat de type float

Derrière je fais différents calcul dans plusieurs méthodes et je retourne une image de type QImage comme ceci :

QImage ClasseImg::conversionImage(){


mCalc=mImg.clone();
QImage Qimg;

/*Ici le calcul*/


Qimg=QImage((const uchar*)mCalc.data,mCalc.cols,mCalc.rows,mCalc.step,QImage::Format_RGB888);
return Qimg.rgbSwapped();
}

Le problème est mon image ne s'affiche pas tout le temps parfois elle s'affiche correctement parfois non ....et si je fais un test en sauvegardant l'image au moment de l'afficher j'ai tout le temps mon image qui est bien enregistrer ....

Est-ce que vous pensez que cela pourrait venir du format de ma QImage , ou de la conversion entre cv::Mat et QImage?

24/02/2017

Crash avec l'opérateur

Bonjour à tous,
Voila j'ai de manière assez aléatoire des crashs sur les lignes comportant l’opérateur<< de QTextStream.

Je doit écrire dans un fichier temporaire certaines donnés, puis ce fichier temporaire et relu par le soft qui traite les données au fur qui sont mise dans un fichier final avant de supprimer le fichier temporaire sachant que ces actions sont répété en boucle pendant un certain temps. Cela me permet de traiter zone après zone mes informations.

Or de manière tout a fait aléatoire d'un coup je ne peux plus supprimer mon fichier temporaire puis même si j'écrase le contenu de mon fichier au bout d'un moment je ne peut plus écrire dans mon fichier final . je reçois l'erreur : <blockquote>The inferior stopped because it triggered an exceptions. Stopped in thread 11 by : Exception at 0x7ffb78a841es, code: 0x0000005: write acces violation at 0x1, flag= 0x0

lorsque je passe par le bout de code suivant :
 if ( flux.status() != QTextStream::Ok)
return;
if (flux.device() == NULL)
return;

if (direction == HORIZONTAL)
{
flux << "1vv10.0" << endl; // ligne du crash
}
le crash se fait sur la ligne
flux << "1vv10.0" << endl;
J'ai également pu avoir la meme erreur lors de l'utilisation de qDebug()

pour information j'utilise Qtcreator avec QT 5.2.1
06/03/2017

Liste des pistes avec le MediaPlayer Qt

Bonjour,

je me suis mis à utiliser le MediaPlayer standard de Qt, mais celui ci ne semble pas gérer les différentes pistes audio et vidéo (pour les différentes languages notamment). Le média player de la freebox semble le gérer avec les propriétés videoList audioList et subtitleList (http://dev.freebox.fr/sdk/libfbxqml/priv/media/audio_player.html#fbx.media.AudioPlayer). Y a t il un équivalent avec le MediaPlayer Qt ?

D'avance merci,

Cordialement,

Christophe.
20/03/2017

XmlListModel question

Bonjour,
Dans un XmlListModel : (exemple)

import QtQuick 2.0
import QtQuick.XmlListModel 2.0

XmlListModel {
id: xmlModel
source: "http://www.mysite.com/feed.xml"
query: "/rss/channel/item"

XmlRole { name: "title"; query: "title/string()" }
XmlRole { name: "pubDate"; query: "pubDate/string()" }
}
Je ne vois pas a quoi correspond le "query: "/rss/channel/item""...
Que dois je mettre a la place de /rss/channel/item ?
Merci
17/03/2017

Pointeur sur QbyteArray

Salut,
j'ai un petit souci concernant le pointeur sur QbyteArray: En utilisant .data(), la doc dit que j'obtiens un pointeur sur mon QbytaArray, mais lorsque j'essaye de le modfiier dans une fonction (Ajout du CRC), ça ne fonctionne pas....

Mon code .h

/**
* @brief Fonctions::crcSeize : calcul du crc
*
* @param char *pFrame : pointeur sur la trame
* @param quint32 pFrameLength : longueur de la trame
* @param bool pAjoute : Ajoute le crc à la frame
*/
static quint16 crcSeize(char *pFrame, quint32 pFrameSize, bool pAjoute);
mon code .cpp

/**
* @brief Fonctions::crcSeize : calcul du crc
*
* @param char *pFrame : pointeur sur la trame
* @param quint32 pFrameLength : longueur de la trame
* @param bool pAjoute : Ajoute le CRC à la fin de la trame
*
*/
quint16 Fonctions::crcSeize(char* pFrame, quint32 pFrameSize, bool pAjoute){

quint16 POLY_CRC16 = 0xA001; // Polynome pour calcul du CRC
quint16 crc = 0xFFFF; // Initialise 16 Bits a 1;

for(quint32 i=0; i < pFrameSize; i++){

crc ^= quint16(pFrame[i]);

for(quint8 j = 0; j < 8; j++){

if(crc & 0x1){
crc >>= 1;
crc ^= POLY_CRC16;
}else
crc >>= 1;
}
}

if(pAjoute){
pFrame[pFrameSize] = lowByte(crc);
pFrame[pFrameSize + 1] = highByte(crc);
}

return crc;
}
Mon code de test:

void MainWindow::on_cbTestCrc_clicked()
{
QString test = this->uiMainWindow->leTestCrc->text();
//QByteArray testCrc = QByteArray::fromHex(this->uiMainWindow->leTestCrc->text());
QByteArray testCrc = QByteArray::fromHex("29030EF1001C");

quint16 crc = this->fonctions.crcSeize(testCrc.data(), testCrc.size(), true);
this->uiMainWindow->leResultCrc->setText(QString::number(crc));

this->uiMainWindow->leTestCrc->setText(testCrc.toHex());
}
09/03/2017

QXml : Ajout d'un élément en fonction son identifiant // un équivalent de isatEnd(); et isEmpty();

Bonjour à tous,

Je me retrouve avec une fonction vraiment pas propre pour laquelle j'aurai besoin de vos conseils.
L'objectif de cette fonction est de lire un fichier Xml serveur, de choisir un élément de ce fichier en fonction de son nom et de l'inscrire dans un fichier Xml Utilisateur dans l'ordre de son "Id", un int de 1 à 80.

Cela semble vraiment simple à priori, sauf que je ne trouve pas de fonction type "isAtEnd()"; ou isEmpty();
Du coup je fais un peu n'importe quoi :
void Xml::insertUnElement(QString nom)
{
if (documentServeur.isNull())
return;
if (documentUtilisateur.isNull())
return;
QDomElement rootServeur = documentServeur.firstChildElement();
QDomNode domNodeServeur = rootServeur.firstChild();
while(!domNodeServeur.isNull())
{
QDomElement domElementServeur = domNodeServeur.toElement();
qDebug()<< domElementServeur.attribute("Nom") << nom;
if (domElementServeur.attribute("Nom") == nom)
{
QDomElement rootUtilisateur = documentUtilisateur.firstChildElement();
QDomNode domNodeUtilisateur = rootUtilisateur.firstChild();
if (domNodeUtilisateur.isNull())
{
documentUtilisateur.clear();
rootUtilisateur = documentUtilisateur.createElement("liste");
documentUtilisateur.appendChild(rootUtilisateur);
documentUtilisateur.createElement("Element");
rootUtilisateur.appendChild(domElementServeur.cloneNode());
qCritical()<<"Je crée mon premier élément"; ////////isEmpty()
return;
}
while(!domNodeUtilisateur.isNull())
{
QDomElement domElementUtilisateur = domNodeUtilisateur.toElement();
if (domElementServeur.attribute("Id").toInt() == domElementUtilisateur.attribute("Id").toInt())
{
qDebug()<<"Le logiciel était déja présent";
return;
}
if (domElementUtilisateur.attribute("Id").toInt() > domElementServeur.attribute("Id").toInt())
{
qCritical()<<"J'ajoute l'élement en fonction de l'ID";
documentUtilisateur.createElement("Element");
rootUtilisateur.insertBefore(domElementServeur.cloneNode(),domNodeUtilisateur);
return;
}
domNodeUtilisateur = domNodeUtilisateur.nextSibling();
if (domNodeUtilisateur.isNull())
{
qCritical()<<"J'ajoute l'élément à la fin du document"; /////// isAtEnd();
documentUtilisateur.createElement("Element");
rootUtilisateur.insertAfter(domElementServeur.cloneNode(),domNodeUtilisateur);
return;
}
}
}
domNodeServeur = domNodeServeur.nextSibling();
}
qDebug()<<"Cela a merdé. Pas d'ajout de logiciel";
}
Deux parties me semblent particulièrement gênantes :
                domNodeUtilisateur = domNodeUtilisateur.nextSibling();
if (domNodeUtilisateur.isNull())
{
qCritical()<<"J'ajoute l'élément à la fin du document";
documentUtilisateur.createElement("Element");
rootUtilisateur.insertAfter(domElementServeur.cloneNode(),domNodeUtilisateur);
return;
}
// Lancer nextSibling(); pour voir si on pointe sur le dernier élément de la liste Xml et faire un insertAfter ... C'est chaud non ?

et l'autre :
            if (domNodeUtilisateur.isNull())
{
documentUtilisateur.clear();
rootUtilisateur = documentUtilisateur.createElement("liste");
documentUtilisateur.appendChild(rootUtilisateur);
documentUtilisateur.createElement("Element");
rootUtilisateur.appendChild(domElementServeur.cloneNode());
qCritical()<<"Je crée mon premier élément";
return;
}
// Devoir attendre de savoir si domNodeUtilisateur.isNull() pour savoir si le document Xml est vide ... Cela me semble éloigné non ?

Je suis compréhensible ?


Voici la génération du fichier Xml :
    QDomElement root = domDocument.createElement("liste");
domDocument.appendChild(root);

QDomElement A00001 = domDocument.createElement("Element");
A00001.setAttribute("Id",1);
A00001.setAttribute("Nom", "Stickies");
A00001.setAttribute("Level01", "Bureautique");
A00001.setAttribute("Level02", "Accessoires de bureau");
A00001.setAttribute("Level03", "Pense-Bête");
A00001.setAttribute("Level04", "Stickies");
A00001.setAttribute("Path", "/Apps/Stickies/StickiesLKL.exe");
A00001.setAttribute("Icone01", ":/Icone/Icone/office.ico");
A00001.setAttribute("Icone02", ":/Icone/Icone/my_apps.ico");
A00001.setAttribute("Icone03", ":/Icone/Icone/my_apps.ico");
A00001.setAttribute("Icone04", ":/Icone/Icone/Stickies.ico");
A00001.setAttribute("Version",1);
A00001.setAttribute("Taille",2703189);
root.appendChild(A00001);

QDomElement A00002 = domDocument.createElement("Element");
A00002.setAttribute("Id",2);
A00002.setAttribute("Nom", "Pc Chrono");
A00002.setAttribute("Level01", "Bureautique");
A00002.setAttribute("Level02", "Chronomètre");
A00002.setAttribute("Level03", "Pc Chrono");
A00002.setAttribute("Path", "/Apps/PCChrono/PCChronoLKL.exe");
A00002.setAttribute("Icone01", ":/Icone/Icone/office.ico");
A00002.setAttribute("Icone02", ":/Icone/Icone/my_apps.ico");
A00002.setAttribute("Icone03", ":/Icone/Icone/PcChrono.ico");
A00002.setAttribute("Version",1);
A00002.setAttribute("Taille",873350);
root.appendChild(A00002);

QDomElement A00004 = domDocument.createElement("Element");
A00004.setAttribute("Id",3);
A00004.setAttribute("Nom", "PDF-XChange Viewer");
A00004.setAttribute("Level01", "Bureautique");
A00004.setAttribute("Level02", "PDF");
A00004.setAttribute("Level03", "PDF-XChange Viewer");
A00004.setAttribute("Path", "/Apps/PDFXchangeViewer/PDFXChangeViewerLKL.exe");
A00004.setAttribute("Icone01", ":/Icone/Icone/office.ico");
A00004.setAttribute("Icone02", ":/Icone/Icone/my_apps.ico");
A00004.setAttribute("Icone03", ":/Icone/Icone/PDFX.ico");
A00004.setAttribute("Version",1);
A00004.setAttribute("Taille",41652057);
root.appendChild(A00004);

QDomElement A00005 = domDocument.createElement("Element");
A00005.setAttribute("Id",4);
A00005.setAttribute("Nom", "OpenOffice");
A00005.setAttribute("Level01", "Bureautique");
A00005.setAttribute("Level02", "Suite bureautique");
A00005.setAttribute("Level03", "OpenOffice");
A00005.setAttribute("Path", "/Apps/OpenOffice/OpenOfficeLKL.exe");
A00005.setAttribute("Icone01", ":/Icone/Icone/office.ico");
A00005.setAttribute("Icone02", ":/Icone/Icone/my_apps.ico");
A00005.setAttribute("Icone03", ":/Icone/Icone/OpenOffice.ico");
A00005.setAttribute("Version",1);
A00005.setAttribute("Taille",387262312);
root.appendChild(A00005);
.....
15/03/2017

Lire du xml depuis une variable impossible ?

Bonjour ,
j'ai besoin de nouveau de vos lumières .
Depuis un serveur je reçois des données sous forme xml plus ou moins longues que je stocke dans une variable
QString 
et non dans un fichier ,je ne veux pas créer de fichier xml pour économiser la mémoire .
- je voudrais savoir si il est possible et comment lire du xml dans une variable et relever des informations précise par rapport aux balises.
- Si il n'est pas possible de le traiter comme du xml , existe t'il une fonction qui permette de relever les caractères qui se trouve entre deux caractère dans un
QString 
.
par exemple :
 QString test;
test = "Bonjour <balise> les </balise> amis";
Qstring Resultat;
Resultat = toutes les chaines de test qui son entre les chaines <balise> </balise> ;//donc Resultat = les
Dans un premier temps j'ai tenté d'utiliser Qdom pour lire le xml dans ma variable sans résultat.

Ici un exemple de xml
<?xml version=\"1.0\"?>
<ts_affaire>
<S_Affaire>
<ch_RefAffaire> 140211L </ch_RefAffaire>
<ch_Libellé> Pb ordi caisse scanner se met en veille de temps en temps </ch_Libellé>
<ch_RefResponsable> BEB </ch_RefResponsable>
<ch_Status> En cours </ch_Status>
<ch_Facturation> A faire </ch_Facturation>
</S_Affaire>
<S_Affaire>
<ch_RefAffaire>151106D</ch_RefAffaire>\r\n\t\t
<ch_Libellé>Pb écran ancien serveur</ch_Libellé>\r\n\t\t
<ch_RefResponsable>BEB</ch_RefResponsable>\r\n\t\t
<ch_Status>En cours</ch_Status>\r\n\t\t
<ch_Facturation>A faire</ch_Facturation>\r\n\t
</S_Affaire>\r\n\t
</ts_affaire>
Maintenant je vous montre ce que j'ai essayé de faire en Qdom
 void F_RecapAffaire::recupererListeAffaire(QString listeduTableau)//listeduTableau contient le code xml 
{
QStringList ch_RefAffaire;
ch_RefAffaire = listeduTableau.split("<ch_RefAffaire>",QString::SkipEmptyParts);
QFile f(listeduTableau);
// utilisation de qdom
// f = listeduTableau;
QDomDocument xmlBOM;
xmlBOM.setContent(&f);

QDomElement comp=xmlBOM.firstChild().toElement();
//Le programme ne passe même pas par cette ligne comme ce n'est pas fichier je pense que c'est pour cela que sa ne fonctionne pas
if(comp.tagName()=="S_Affaire")
{
QDomNode nodeS_Affaire = comp.firstChildElement("S_Affaire");
if(nodeS_Affaire.isNull())
{

qDebug()<<"il n'y a pas <S_Affaire>";

}

QDomNode nodech_RefAffaire = nodeS_Affaire.firstChildElement("RefAffaire");
if(nodeBrief.isNull())
{

qDebug()<<"il n'y a pas <RefAffaire>";
}

QString ch_RefAffaire = nodeS_Affaire.firstChild().toText().data();

qDebug() << " ch_RefAffaire = " << ch_RefAffaire.toStdString().c_str() ;

QDomNode nodech_Libelle = nodeS_Affaire.firstChildElement("libelle");
if(nodech_Libelle.isNull())
{
qDebug()<<"libelle est vide";
}

QString ch_Libelle = nodech_Libelle.firstChild().toText().data();

qDebug() << " libelle = " << ch_Libelle.toStdString().c_str();
}
}
j'ai ensuite regardé du coté de
QXmlStreamReader
mais je n'ai pas vraiment compris comment l'utiliser et de plus tout les exemples que j'ai vu sont fait à partir d'un fichier .