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 imWriteData()
-Slot (ohne Funktions-Parameter) direkt aufbox->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(); }