Qt: Wert aus ComboBox in Datei schreiben



  • Servus,

    ich habe ein kleines Problem und ich hoffe Ihr könnt mir da weiterhelfen.

    Ich habe eine GUI mit einem Drop-Down-Menü und bei Betätigung des OK-Buttons möchte ich den Wert des Drop-Down-Menü in eine Datei schreiben.

    Leider wird der zuständige Slot, sobald ich einen Übergabeparameter verwende nicht mehr ausgeführt. Leider verstehe ich nicht woran das liegt.

    Mit freundlichen Grüßen
    Kai

    #include <QApplication>
    #include <QComboBox>
    #include <QLabel>
    #include <QHBoxLayout>
    #include <QPushButton>
    #include <fstream>
    #include <iostream>
    #include <string>
    #include "gui.h"
    
    //using namespace std;
    
    MyGui::MyGui()
    {
    	QWidget *mainWidget = new QWidget();
    
    	//Erzeugen der Elemente für GUI
    	QComboBox *box = new QComboBox();
    	QPushButton *but_ok  = new QPushButton("OK");
    	QPushButton *but_can = new QPushButton("Cancel");
    	QLabel *label = new QLabel("Please make a choice");
    
    	//Neues Layout erstellen
    	QHBoxLayout *layout = new QHBoxLayout();
    
    	//Auswahl Möglichkeiten für ComboBox
    	std::fstream f;
    	char line[1024];
    	f.open("auswahl.txt",std::ios::in);
    
    	while((!f.eof()) && (!f.fail()) )
    	{
    		f.getline(line, sizeof(line));
    		box->addItem(line);
    	}
    	f.close();
    
    	//Elemente in Layout einfügen
    	layout->addWidget(label);
    	layout->addWidget(box);
    	layout->addWidget(but_ok);
    	layout->addWidget(but_can);
    
    	mainWidget->setLayout(layout);
    	mainWidget->adjustSize();
    	mainWidget->show();
    
    	//Signale verbinden
    	QObject::connect(but_can,SIGNAL(clicked()),this,SLOT(Quit()));
    	QObject::connect(but_ok,SIGNAL(clicked()),this,SLOT(WriteData(box->currentText))); 
    }
    
    void MyGui::WriteData(QString valueofbox)
    {
    	std::fstream f_out;
    	f_out.open("O:\DATEN\ausgabe.txt",std::ios::out);
    	//f_out << "Hallo" << std::endl;
    	f_out << valueofbox.data() << std::endl;
    	f_out.close();
    
    	exit(0);
    }
    
    void MyGui::Quit()
    {
    	exit(0);
    }
    


  • Entschuldigt den Doppelpost, aber leider gibt es kein "edit".

    Folgende Fehlermeldung wird übrigens angeführt "No such slot MyGui::WriteData(WriteData(box->currentText)"

    Wenn ich den Slot teste, ohne Übergabeparameter funktioniert er.

    Hier noch die Header-Datei

    #pragma once
    #include <QWidget>
    #include <QComboBox>
    #include <QString>
    #include <string>
    
    class MyGui : public QWidget
    {
    	Q_OBJECT   
    public:
    	MyGui();
    private slots:
    	void WriteData(QString);
    	void Quit();
    };
    


  • Ein Slot kann nur empfangen, was ein Signal sendet. D.h.

    QObject::connect(but_ok,SIGNAL(clicked()),this,SLOT(WriteData(box->currentText)));
    

    geht nicht, da ein SIGNAL(clicked()) nichts liefert, deshalb die Meldung.

    In deinem Fall würde ich die QComboBox* box vom Konstruktor in die Klassen-Deklaration verlegen und im WriteData() -Slot (ohne Funktions-Parameter) direkt auf box->currentText zugreifen.

    class MyGui : public QWidget
    {
        Q_OBJECT  
    public:
        MyGui();
    private:
        QComboBox* box;
        // Am besten alle GUI-Elemente hierher, dann kann
        // jede Methode darauf zugreifen
    
    private slots:
        void WriteData();
        void Quit();
    };
    

    PS: Für einen Edit musst du dich anmelden, sonst könnte ja jeder das Posting ändern.



  • mainWidget brauchst du nicht. Dein MyGui ist ja schon ein QWidget.

    MyGui::MyGui()
    {
        //QWidget *mainWidget = new QWidget(); 
        ...
        /* mainWidget-> */ setLayout(layout);
        /* mainWidget-> */ adjustSize();
        ...
        //mainWidget->show(); <- weglassen
        ...
    }
    
    MyGui g;
    g.show();
    


  • Danke für die Antwort.

    Anmerkung:

    Wer schließlich den Text ausgeben möchte, muss folgendermaßen vorgehen

    f_out << box->currentText().toAscii().data() << std::endl;
    


  • Noch kleiner Tipp, das File lesen und schreiben geht mit Qt wie folgt:

    QFile file("auswahl.txt");
        if (file.open(QIODevice::Text | QIODevice::ReadOnly))
        {
            QTextStream f(&file);
            // Bei Bedarf Kodierung setzen
            // ansonsten wird Locale genommen      
            // f.setCodec("UTF-8");
            // f.setCodec("ISO 8859-1");
            while (!f.atEnd()) {
                box->addItem(f.readLine());
            }
            file.close();
        }
    
    QFile file("O:/DATEN/ausgabe.txt");
        if (file.open(QIODevice::Text |
                      QIODevice::WriteOnly | 
                      QIODevice::Append )) {
            QTextStream f_out(&file);
            // Bei Bedarf Kodierung setzen
            // ansonsten wird Locale genommen
            // f_out.setCodec("UTF-8");
            // f_out.setCodec("ISO 8859-1");
            f_out << valueofbox << "\n";
            file.close();
        }
    

Anmelden zum Antworten