salut je travail sur un projet , je suis bloque pour le moment au niveau de recuperer le nom d'un fichier qui s'ecrit dans un QLineEdit je lis ce qu'est ecrit avec la methode text() qui renvoie un qstring et pour le convertir en string j'ai utilise la methode toStdString , mais ca fonctionne pas , lorsque j'affiche sur le terminal la valuer convertit il s'affiche toujours le chiffre 1 , voila mon code :
{
MaFenetre *so = new MaFenetre;
QString qs = so->Lire_LineEdit() ;
std::string inputFileName = qs.toStdString();
std::cout<< "le nom du fichier :"<<inputFileName<<endl ;
}
j'ai utilise la methode LireçLineEdit() qui lit ce qui ecrit sur LineEdit , puisque l'objet est dans un autre classe MaFenetre, j'ai teste aussi avec les methodes :
toUtf8().constData();
toLocal8Bit().constData();
mais j'ai toujours le même problème que la valeur convertie égal à le chiffre 1 ; et merci d'avance pour vos aides
Tu parle de la fonction Lire_LineEdit() de ta classe MaFenêtre, mais:
1- quel est le prototype de cette fonction? qu'est-elle sensée renvoyer?
2- es tu sur qu'elle renoie effectivement la donnée adéquate? comment est-elle implémentée ?
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Je pense qu'il faudrais un peu plus de code pour comprendre, je pense à titre personnel que le problème viens de ta fonction "Lire_LineEdit()" mais je peu me tromper, pourrais t'on avoir plus de détails ?
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
devrait déjà faire l'affaire. Si tu obtiens "1", dans str, peut-être est-ce "simplement" parce que... entry1 (dans ta fenêtre) affiche... 1
Et si ce n'est pas le cas, c'est qu'il y a un problème "ailleurs"...
Ma boule de crystal me fait d'ailleurs dire que cela pourrait être dans le constructeur de MaFenetre...
le code qui crée entry1 ne prendrait-il pas une forme proche de
QLineEdit *entry1 = new QLineEdit(/*..*/);
alors que entry1 serait déclaré sous la forme de
QLineEdit * entry1;
dans la définition de ta classe MaFenetre????
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
devrait déjà faire l'affaire. Si tu obtiens "1", dans str, peut-être est-ce "simplement" parce que... entry1 (dans ta fenêtre) affiche... 1
Et si ce n'est pas le cas, c'est qu'il y a un problème "ailleurs"...
Ma boule de crystal me fait d'ailleurs dire que cela pourrait être dans le constructeur de MaFenetre...
le code qui crée entry1 ne prendrait-il pas une forme proche de
QLineEdit *entry1 = new QLineEdit(/*..*/);
alors que entry1 serait déclaré sous la forme de
QLineEdit * entry1;
dans la définition de ta classe MaFenetre????
pour la declaration de entry1 j'ai fait :
QLineEdit *entry1;
entry1 = new QLineEdit;
je pense pas que entry1 affiche 1 puisque j'ai crée un autre méthode de la classe MaFenetre qui return ce qu'est écrit sur entry1 et le mettre comme texte d'un autre bouton et fonctionne bien aussi j'ai fait la conversion dans la classe MaFenetre et je l'affiche sur console tout bien marche, donc le probleme vient de le fait d'utiliser une methode d'une autre classe et je sais pas comment resoudre ce probleme
Bon, comme tu ne nous a jamais montré que des bouts de code sans queue ni tête, commencons par le commencement:
Pourrais tu nous donner:
- 1 la définition complete de ta classe MaFenêtre
- 2 le code complet de son construteur
- 3 la définition complète de la classe qui contient cette fonction membre ou, à défaut
- 4 la définition complète de la fonction libre qui pose problème
Car, tant que l'on n'aura pas tout cela, on ne pourra que jouer aux devinettes, et tu n'obtiendras donc pas une aide aussi efficace que possible
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
MaFenetre so ; // Création d'une NOUVELLE fenêtre
// fenêtre, qui n'est même pas affichée
Donc qu'espères-tu en retirer à partir de là ?
Non sans compter que la première ligne n'est même pas valide. Comme koala01, j'espère un minimum d'effort de ta part pour nous présenter convenablement ton problème.
using namespace QtDataVisualization ;
class Code : public QObject {
Q_OBJECT
public :
explicit Code(Q3DScatter *scatter);
public slots :
std::vector<point> readingData();
void addData();
}
Code.cpp
using namespace QtDataVisualization ;
Code::Code(Q3DScatter *scatter) : m_graph(scatter),
{
m_graph->activeTheme()->setType(Q3DTheme::Theme(1));
m_graph->axisX()->setTitle("X");
m_graph->axisY()->setTitle("Y");
m_graph->axisZ()->setTitle("Z");
}
std::vector<point> Code::readingData() {
MaFenetre so ;
QString qs = so.Lire_LineEdit();
qDebug() <<qs;
std::string inputFileName = qs.toStdString();
//std::cout<< "le nom du fichier :"<<inputFileName<<endl;
std::vector<point> inputData;
std::string line, token;
point newPoint;
std::ifstream file;
file.open(inputFileName.c_str(), std::ifstream::in);
if (file.is_open())
{
while (getline(file, line))
{
std::istringstream ss(line);
getline(ss, token, ' ');
newPoint.x = stod(token);
// getline(ss, token, ' ');
newPoint.y = stod(token);
//getline(ss, token, ' ');
newPoint.z = stod(token);
inputData.push_back(newPoint);
//std::cout << inputData.at(2).x << endl;
}
}
else
std::cout << "Unable to open file";
file.close();
return inputData ;
}
void Code::addData(){
QScatterDataProxy *proxy = new QScatterDataProxy;
QtDataVisualization::QScatter3DSeries *series = new QtDataVisualization::QScatter3DSeries(proxy);
std::vector<point> inputData = Code::readingData();
QtDataVisualization::QScatterDataArray data;
for (int i=0; i<inputData.size();i++)
{
data << QVector3D(inputData.at(i).x , inputData.at(i).y , inputData.at(i).z);
data.push_back(QtDataVisualization::QScatterDataItem(QVector3D(inputData.at(i).x,inputData.at(i).y,inputData.at(i).z)));
};
series->dataProxy()->addItems(data);
m_graph->addSeries(series);
}
J'avouerai que là, j'ai quand même un peu de mal ...
Car c'est ton code qui construit ta fenêtre, et ca, c'est pas vraiment normal
Et non seulement il la construit une fois (chose que j'aurais éventuelllement pu accepter, à condition que tu m'en donne la raison), mais il va la construire à chaque fois que la fonction readingData sera appelée (et la détruire lorsque cette fonction arrivera à son terme). Et ca, c'est clairement pas la meilleure des choses à faire.
Car, du coup, quelle que soit la manière dont tu arrives à faire appel à la fonction readingData depuis ton instance de MaFenêtre, il faut te rendre compte que la fonction readingData utilise une instance de MaFenêtre qui n'a strictement rien à voir avec l'instance au départ de laquelle readingData a été appelée!!!
Il est donc tout à fait normal que la récupération du texte de ton QLineEdit renvoie... la valeur qui se trouve dans ce QLineEdit juste après la création de cette nouvelle instance
- Edité par koala01 19 juin 2018 à 18:00:15
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
J'avouerai que là, j'ai quand même un peu de mal ...
Car c'est ton code qui construit ta fenêtre, et ca, c'est pas vraiment normal
Et non seulement il la construit une fois (chose que j'aurais éventuelllement pu accepter, à condition que tu m'en donne la raison), mais il va la construire à chaque fois que la fonction readingData sera appelée (et la détruire lorsque cette fonction arrivera à son terme). Et ca, c'est clairement pas la meilleure des choses à faire.
Car, du coup, quelle que soit la manière dont tu arrives à faire appel à la fonction readingData depuis ton instance de MaFenêtre, il faut te rendre compte que la fonction readingData utilise une instance de MaFenêtre qui n'a strictement rien à voir avec l'instance au départ de laquelle readingData a été appelée!!!
Il est donc tout à fait normal que la récupération du texte de ton QLineEdit renvoie... la valeur qui se trouve dans ce QLineEdit juste après la création de cette nouvelle instance
- Edité par koala01 il y a environ 1 heure
moi je creer ma fenetre dans le main ds readingData tu as raison j'ai cree la 2eme objet fenetre car je trouve pas autre solution de faire appelle a la fonction Lire_LineEdit()
pour lire ce qui est sur LineEdit , sinon tu me conseille de quoi faire pour résoudre le probleme
A vrai dire, je verrais plutôt quelque chose comme
class MaFenetre : public QWidget
{ Q_OBJECT
public:
MaFenetre();
public :
public slots:
/* C'est la fenêtre qui décide de lire les informations
void onReadData();
private:
QLineEdit *entry1;
QGridLayout *grid1;
}
class Code : public QObject {
Q_OBJECT
public :
explicit Code(Q3DScatter *scatter, );
/*Quand on demande de lire un fichier, on
* en indique le nom
*/
std::vector<point> readingData(QString filename);
public slots :
void addData();
private:
}
std::vector<point> Code::readingData(QString filname) {
std::string inputFileName = filname.toStdString();
/* ... la suite */
}
MaFenetre::MaFenetre() : QWidget()
{
/* tout ce qu'il faut
* ...
*/
MaFenetre::connect(uploaddata,&QPushButton::clicked,
this,&MaFenetre::onReadData);
}
void MaFenetre::onReadData(){
/* on crée un code */
Code code(/* paramètres requis*/);
/* et on lui demande de lire un fichier
* dont on récupère le nom depuis entry1
*/
auto result = code.readingData(entry1->text());
/* on fait "ce qu'il faut" du résultat*/
}
C'est simple, c'est efficace, et cela ne risque pas de casser
- Edité par koala01 20 juin 2018 à 17:15:47
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
A vrai dire, je verrais plutôt quelque chose comme
class Code;
class MaFenetre : public QWidget
{ Q_OBJECT
public:
MaFenetre();
public :
QString Lire_LineEdit();
public slots:
/* C'est la fenêtre qui décide de lire les informations
void onReadData();
private:
QLineEdit *entry1;
QGridLayout *grid1;
Code * code; // la fenêtre connait le code
}
class Code : public QObject {
Q_OBJECT
public :
explicit Code(Q3DScatter *scatter, );
/*Quand on demande de lire un fichier, on
* en indique le nom
*/
std::vector<point> readingData(QString filename);
public slots :
void addData();
private:
}
std::vector<point> Code::readingData(QString filname) {
std::string inputFileName = filname.toStdString();
/* ... la suite */
}
MaFenetre::MaFenetre() : QWidget()
{
/* tout ce qu'il faut
* ...
*/
MaFenetre::connect(uploaddata,&QPushButton::clicked,
this,&MaFenetre::onReadData);
}
void MaFenetre::onReadData(){
/* on crée un code */
Code code(/* paramètres requis*/);
/* et on lui demande de lire un fichier
* dont on récupère le nom depuis entry1
*/
auto result = code.readingData(entry1->text());
/* on fait "ce qu'il faut" du résultat*/
}
C'est simple, c'est efficace, et cela ne risque pas de casser
ok merci beaucoup aussi j'ai reflicher de mettre classe code qui herite deMaFenetre je pense ca aussi ca va fonctionner , et merci bcp pour ton aide
Tu n'aurais pas changé d'avis pendant l'écriture par hasard ?
Étant donné le code du slot, ce membre ne sert à rien.
Si au temps pour moi ... je corrige le code
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Am I dev ? 0x90
Am I dev ? 0x90
C'est simple, c'est efficace, et cela ne risque pas de casser