Les derniers messages du forum QtFR.

15/12/2017

Insérer un layout dans un layout du parent...

Salut,
Je ne sais pas si tout est dans le titre, mais bon... Je vous donne quelques explications...
J'ai une fenêtre principale avec pas mal de chose dessus, dont un tab Widget. Pour éviter de surcharger (d'avoir trop de ligne de code) dans le .cpp de ma fenêtre, j'ai créé un widget par onglet (en fait une classe qui hérite de widget).
Dans un de mes widget, je construis de façon dynamique des layout dans lesquels j'y mets des lignes et des colonnes des champs, label... Jusque là ça va.
Et je bloque à comment insérer chacun de mes layout dans le layout de l'onglet parent... Peut-être que je n'utilise pas la bonne façon....
Un peu de code
Dans ma fenêtre.cpp
void MainWindow::updateIhm(TPCANMsg *pFrame)
{
Overview *overviewTab;
overviewTab = new Overview(this);

//overviewTab.updateFrame(pFrame);

overviewTab->createDisplayFields(12, false);
}
Dans la classe Overview.cpp
#include "overview.h"

Overview::Overview(QWidget *parent) : QWidget(parent)
{

}

void Overview::createDisplayFields(quint8 pNbSmu, bool pSpy)
{
/****************************
* SMU SN
* *************************/
if(!pSpy)
{
QVBoxLayout *vlSmuSn = new QVBoxLayout();
vlSmuSn->setContentsMargins(5, 5, 0, 0);
vlSmuSn->setSpacing(7);

// Label Smu SN
QLabel *lbSmuSn = new QLabel("Smu Sn", this);
lbSmuSn->setObjectName("lbSmuSn");
lbSmuSn->setMinimumWidth(135);
lbSmuSn->setMaximumWidth(135);

vlSmuSn->addWidget(lbSmuSn);

for(qint8 i = 0; i < pNbSmu + 1; i++)
{
// Line Edit SMU SN
QHBoxLayout *hlSmuSn = new QHBoxLayout();
hlSmuSn->setContentsMargins(2, 2, 0, 0);
hlSmuSn->setSpacing(3);

// Year
QLineEdit *leSmuSnYear = new QLineEdit(this);
leSmuSnYear->setMinimumWidth(55);
leSmuSnYear->setMaximumWidth(55);
leSmuSnYear->setReadOnly(true);
leSmuSnYear->setAlignment(Qt::AlignCenter);
leSmuSnYear->setObjectName("leSmuSnYear" +QString::number(i + 1));

hlSmuSn->addWidget(leSmuSnYear);

this->listSnYear.insert(i, leSmuSnYear);

// Month
QLineEdit *leSmuSnMonth = new QLineEdit(this);
leSmuSnMonth->setMinimumWidth(55);
leSmuSnMonth->setMaximumWidth(55);
leSmuSnMonth->setReadOnly(true);
leSmuSnMonth->setAlignment(Qt::AlignCenter);
leSmuSnMonth->setObjectName("leSmuSnMonth" +QString::number(i + 1));

hlSmuSn->addWidget(leSmuSnMonth);

this->listSnMonth.insert(i, leSmuSnMonth);

// Number
QLineEdit *leSmuSnNumber = new QLineEdit(this);
leSmuSnNumber->setMinimumWidth(55);
leSmuSnNumber->setMaximumWidth(55);
leSmuSnNumber->setReadOnly(true);
leSmuSnNumber->setAlignment(Qt::AlignCenter);
leSmuSnNumber->setObjectName("leSmuSnNumber" +QString::number(i + 1));

hlSmuSn->addWidget(leSmuSnNumber);

this->listSnNumber.insert(i, leSmuSnNumber);

vlSmuSn->addLayout(hlSmuSn);
}

// ICI, je ne sais pas comment insérer vlSmuSn dans le layout qui se trouve sur l'onglet du parent
}

}
Le overview.h au cas ou...
#define OVERVIEW_H

#include <QWidget>
#include <QList>
#include <QLabel>
#include <QLineEdit>
#include <QVBoxLayout>

#include "frame.h"
#include "fonctions.h"
#include "pcanbasic.h"

class Overview : public QWidget
{
Q_OBJECT

public:
explicit Overview(QWidget *parent = 0);
void updateFrame(TPCANMsg *pMsgReceived);
void createDisplayFields(quint8 pNbSmu, bool pSpy);
void setRcvFrame(Frame *value);
Frame *getSentFrame() const;
void setSentFrame(Frame *value);

signals:


public slots:

private:
Fonctions fonctions;

Frame *receiveFrame;
Frame *sentFrame;

QList<Frame> frame380;
QList<Frame> frame100;
QList<Frame> frame140;

QList<QLineEdit*> listSnYear;
QList<QLineEdit*> listSnMonth;
QList<QLineEdit*> listSnNumber;

QList<QLineEdit*> listSmuCom;

QList<QLineEdit*> listSmuCapa;
QList<QLineEdit*> listSmuSoh;

QList<QLineEdit*> listSmuTempMod;
QList<QLineEdit*> listSmuTempMin;
QList<QLineEdit*> listSmuTempMax;

QList<QLineEdit*> listVcellMin;
QList<QLineEdit*> listVcellMax;

QList<QLineEdit*> listSwVersion;
QList<QLineEdit*> listCrc;
};

#endif // OVERVIEW_H
13/12/2017

Qtsvg: Fichier svg et ses calques...

Bonjour,
J'ai parcouru la doc mais sans trouver les bonnes infos: j'ouvre en utilisant la classe QSvgRenderer(fichier) un fichier svg issu d'Illustrator, comportant n calques.
L'affichage se fait dans une QGraphicsScene du QGraphicView de la QMainWindow.

Je voudrais pouvoir affecter chacun des calques du svg à un QGraphicSvgItem de manière à pouvoir, après coup, disposer de la liste des items et ainsi pouvoir utiliser la fonction isItemAt(Qpoint ) pour identification de l'objet cliqué.

Est-ce possible?

NB: j'ai essayé de traiter un fichier svg ouvert d'abord en mode texte (format xml) pour tester (les objets sont des polygones; les calques y apparaissent avec leur Id et j'ai pu ainsi récupérer les suites de points de tracé).
Pour 3 des 1ers calques, j'ai créé un fichier texte des points du tracé, permettant ultérieurement, en utilisant QPolygon() d'avoir un item ajouté à la scene: l'affichage correspond bien à l'image réelle et je peux sélectionner ainsi une partie de l'image...

J'ai repris l'ouverture du svg en utilisant l'information sur les calques obtenues avec la lecture du xml du fichier:
 
void loadImage(nom)
{
QSvgRenderer *renderer = new QSvgRenderer(nom);//ouvre le svg de fileName "nom"
QGraphicsSvgItem *gItem;
for (int i=0; i<calques.size();i++)
{
gItem = new QGraphicsSvgItem();
gItem->setSharedRenderer(renderer);
gItem->setElementId(calques[i]);
m_scene->addItem(gItem);// QGraphicsScene *m_scene; défini dans mainwindow.h
gCalques << gItem;//avec QList<QGraphicsSvgItem*> gCalques défini dans mainwindow.h
}
}
Les calques s'affichent bien mais ils se retrouvent tous superposés... cf Image 'Essai-2"
alors que le fichier correspond à 'Espagne.jpg' cf image. Et pourtant, les plolygones tels qu'apparaissant dans le fichier sont bien lus en séquence.
15/12/2017

Modification Style bordure fenêtre

Salut,
Bon allez, j'ose poser la question.... Est-ce qu'il y a moyen de modifier les bordures de ma fenêtre (surtout la couleur)??
Alors après moultes recherches j'ai trouvé ceci, bref une véritable usine à gaz....
Et tous les forum annonce que non, si on ne passe pas par ce genre de modif, c'est pas possible...
Sachant que j'ai un efeuille de style pour tous les composants...

Merci.
14/12/2017

AddItems in comboBox

Salut,
J'ai un petit souci avec une comboBox.
Sur le signal "currentIndexChanged", je lance une fonction qui fait des choses....
Le souci, c'est qu'au démarrage de l'application, je viens charger cette comboBox et la BAM!!! à chaque addItem (ou insertItem, c'est la même chose), le currentIndex change, donc je lance ma fonction...
A part un espèce de booléen global à la fenètre qui empècherai le lancement de ma fonction durant l'init, y at-il une autre solution??
Merci
13/12/2017

Vider la partie visible d'une QComboBox

Salut à tous,
Je sèche sur un petit sujet de rien du tout là, et je ne trouve rien sur les forum...
Voila, j'ai une comboBox que je rempli comme ça:
dans mon constante.h

const QStringList baudRateList = (QStringList() << "Baud_125Kbs" << "Baud_250Kbs" << "Baud_500Kbs" << "Baud_1Mbs");
dans mon .cpp

foreach(const QString &str, baudRateList)
this->ui->cbCanSpeed->addItem(str);

/// Du code....


if(this->initCan())
{
this->ui->cbCanSpeed->setCurrentIndex(-1);
this->ui->cbCanSpeed->setCurrentText("");
}
Bref, si je ne trouve pas de port CAN valide, je voudrais que rien n'apparaisse dans ma combo...
Seule solution que j'ai trouvé, c'est d'ajouter un élément "" dans la liste avec une valeur -1, mais c'est pas joli car quand j'ouvre ma combo, ma première ligne est vide...
Y a t-il moyen de faire autrement?

Merci.
24/11/2017

Problème de compilateur

Salut,
Je viens de dinstaller Qt (5.7.1 et creator 4.2.0) sur mon raspberry (raspbian jessie).
A chque fermeture de l'application il perd le compilateur Gcc, il faut que je le rentre à chaque fois que j'ouvre un projet...
De plus, je n'ai pas la complétion...

Est-ce que quelqu'un connait ce problème? Ou est-ce que se trouvent les fichier de conf de Qt, que je puisses lui rentrer ça en direct?

EDIT: Bon alors j'ai trouvé la solution pour la complétion, en fait j'avais créé un projet "Qt Console Application" et ça fonctionne trsè bien, mais je n'ai pas la complétion, j'ai recréé le projet en "Plain C++ Application" et là j'ai bien la complétion... je ne dois pas bien maîtriser la première....

Merci
05/12/2017

QSqlQuery, ODBC et Pervasive

Bonjour,

Je fait une simple application Qt qui se lance depuis un PC sous win XP et qui accède à une base de donnée Pervasive.

Je fais une requête qui devrait me retourner quelques centaines de résultats mais elle ne me retourne rien (aucun message d'erreur, c'est comme si il n'y avait aucun résultat).
Si je fait la même requête via ODBC sur une base de donnée MS SqlServer sur une table qui porte le même nom depuis le même pc, j’obtiens bien mes résultats.

Si je fait la meme requete sur Pervasive depuis une application Borland, j'obtiens aussi mes résultats.

Si de puis mon application Qt je fait la même requete en faisant une faute dans le nom de la table, elle me retourne bien une erreur.

Auriez-vous une piste ?

Merci d'avance.

void MainWindow::fonction2()
{
QSqlDatabase bdd = QSqlDatabase::addDatabase("QODBC");
bdd.setDatabaseName("xxxxxx");

if(!bdd.open()){
ajouterInfos("Echec ouverture");
return;
}

QSqlQuery query(bdd);

QStringList resultats;

QTime debut = QTime::currentTime();

if(!query.exec( "ma requete")){
ajouterInfos("Erreur requete: " + query.lastError().text());
return;
}

while(query.next()){
resultats << query.value(0).toString();
}

int duree = debut.msecsTo(QTime::currentTime());
ajouterInfos(com);

ajouterInfos(resultats, "RESULTATS");
ajouterInfos("Durée: " + QString::number(duree));

bdd.close();

}
13/11/2017

Qt 4.8.6 et Windows 10

Bonjour,

Un code affichant une image (jpg, png ou svg), compilé (MinGW) sur PC avec Seven tourne sans problème sur Windows 7

Lancé sur Windows 8.1 et 10, le code s'exécute normalement mais aucune image n'est affichée (les dll nécessaires, qjpeg4.dll, qmng4.dll, qsvg4.dll et qtiff4.dll sont bien présentes) et aucun message d'erreur.

Il semble que ces dernières ne soient pas compatibles Windows 10 ?

Quelqu'un a-t'il essayé dans ces conditions?
Exxiste-t'il une solution autre que la recompilation avec Qt 5.9?
01/12/2017

GraphicsView et curseur...

Bonjour,
Poursuivant mon projet, je reviens poser une question à propos de la relation curseur/couleur du point sous le curseur:
Voilà, j'affiche une image (QPixmap d'une image dans un fichier) dans une scene insérée dans une instance dérivée de QGraphicsView (pour gérer les évenements souris).

Lorsque je déplace le curseur souris affiché dans l'image, un clic gauche m'affiche, dans un QTextEdit à droite de l'image:
- la position % scene
- la couleur RGB du point sous le curseur

Jusqu'à là tout est correct (si je modifie la fenêtre, les données affichées restent valables)

Si j'entre maintenant au clavier, les coordonnées du point relevées précédemment et que je les utilise pour déplacer le curseur à la position correspondante sur l'image, je retrouve bien la position.

Mais là où je ne suis plus, c'est que la couleur affichée pour cette position n'est plus celle que j'avais relevée précédemment!
Qu'ai-je donc omis?

NB: en vérifiant dans Illustrator la couleur RGB ainsi affichée (0,48,57), je trouve un gris foncé ressemblant étrangement à celui du fond d'écran du bureau (?)
/* GView 30/11/2017 - test position curseur dans une image affichée dans une QGraphicsView
*
* 1- on affiche une image
* 2- on clique sur un motif et on affiche la position curseur (%scene) et la couleur du point cliqué
* 3- on teste un positionnement dans l'image à partir des coordonnées (%scene) relevées précédemment
* et entrées au clavier dans le champ texte.
**/

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

m_scene = new QGraphicsScene;
ui->gView->setScene(m_scene);
ui->gView->setCursor(Qt::CrossCursor);

connect(ui->pushButton,SIGNAL(clicked()),this, SLOT(doIt()));
connect(ui->gView,SIGNAL(pressed(QPoint)),this,SLOT(showPos(QPoint)));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::doIt()
{
bool ok = m_pix.load("image.svg");
if (ok)
m_scene->addPixmap(m_pix);//ajoute l'image
}

void MainWindow::showPos(QPoint p)
{
ui->tText->append(QString("From gView (pressEvt): %1,%2").arg(p.x()).arg(p.y()));
QPointF sceneP = ui->gView->mapToScene(p);
ui->tText->append(QString("mapToScene: %1,%2").arg(sceneP.x()).arg(sceneP.y()));

QImage image = m_pix.toImage();
QRgb rgb = image.pixel(sceneP.toPoint());
ui->tText->append(QString("color: %1,%2,%3").arg(QColor(rgb).red()).arg(QColor(rgb).green()).arg(QColor(rgb).blue()));
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Return)
{
QStringList list = ui->lText->text().split(',');
QPoint p(list[0].toInt(),list[1].toInt());
ui->tText->append(QString("Coords: %1,%2").arg(p.x()).arg(p.y()));/*coordonnées du point à situer
issues de mousePressEvent()*/

QPoint viewP = ui->gView->mapToGlobal(p);//convertir en position dans viewport
QPoint sceneP = ui->gView->mapFromScene(viewP);//convertir en position scene
QCursor curs(ui->gView->cursor());
curs.setPos(sceneP);//positionne le curseur (ex. milieu du rectangle de l'image 63,62)
QImage image = m_pix.toImage();

QRgb rgb = image.pixel(curs.pos());//affiche la couleur pointée par le curseur
ui->tText->append(QString("color: %1,%2,%3").arg(QColor(rgb).red()).arg(QColor(rgb).green()).arg(QColor(rgb).blue()));
}
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
QPixmap m_pix;
QGraphicsScene *m_scene;

protected:
void keyPressEvent(QKeyEvent *event);

public slots:
void doIt();
void showPos(QPoint p);
};

#endif // MAINWINDOW_H
#ifndef MYVIEW_H
#define MYVIEW_H

#include <QGraphicsView>
#include <QMouseEvent>

class MyView : public QGraphicsView
{
Q_OBJECT
public:
explicit MyView(QObject *parent = 0);

signals:
void pressed(QPoint p);

public slots:

protected:
void mousePressEvent(QMouseEvent *event);

};

#endif // MYVIEW_H
#include "myview.h"

MyView::MyView(QObject *parent) : QGraphicsView()
{
}

void MyView::mousePressEvent(QMouseEvent *event)
{
if(frameRect().contains(event->pos()))
emit pressed(event->pos());

}
27/11/2017

Lire de la memoire brute

Bonjour,

J'ai une classe AnsiString dont le seul attribut est un pointeur sur je ne sais pas quoi (surement des char mais je n'en suis pas certain).

J'aimerai, aller a l'adresse pointée par ce pointeur et afficher le contenu de la mémoire octet par octet. J'ai donc fait ceci et cela semble fonctionner:
#define TAILLE 30
AnsiString str = "ABCD";
//ShowMessage(sizeof(AnsiString)); // donne 4

char resultat[TAILLE];
resultat[TAILLE - 1] = '\0';

void *p = &str;

int* adresseDeAdresse = (int*)p;

int adresse = *adresseDeAdresse;

void * pAdresse = (void*)adresse;

char *cs = static_cast<char*>(pAdresse);

int cpt = 0;
for(int i = 0; i < TAILLE; i++){
resultat[i] = cs[i];
cpt++;
if(cs[i] == '\0') break;
}

ShowMessage(cpt); // affiche 5
ShowMessage(resultat); //affiche "ABCD"

for(int i = 0; i < cpt; i++){
char mess[2];
mess[1] = '\0';

mess[0] = resultat[i];
if(mess[0] == '\0') mess[0] = ';';

ShowMessage(mess);//affiche "A" pui "B" puis "C" puis "D" puis ";"
}
Ma question: y'a t'il un moyen plus élégant de transformer mon AnsiString en char* ?

Merci d'avance.

Bonne journée.