Unsolved Einmal Random generieren
-
Also bei dem ersten Start z.b. aus (Hallo, Moin oder Hay) eine Begrüßung Random heraussucht diese dann Speichert und bei dem nächsten Start dann wieder die Selbe Begrüßung hat
=> Meldung in Datei speichern und beim Start laden. Wenn Datei leer, dann Zufallsmeldung generieren. Ok?
-
Ok, Danke. Ich versuche das mal heraus zu finden. Sonst melde ich mich wieder.
-
Guten Tag,
ich habe jetzt nach einer Grippe endlich einen Zufallsgenerator für Wörter bauen können.
void MainWindow::CmdPruefenNeuClicked() { char const* woerter[] = { "Hallo", "Hello", "Hay" }; int wort_anzahl = sizeof(woerter) / sizeof(woerter[0]); int zahl = (rand() % wort_anzahl); ui->LblAufgabe->setText(woerter[zahl]); }
Das Problem was ich derzeit leider noch nicht lösen konnte ist, dass der bei dem Programmstart automatisch startet.
Das zweite Problem was ich auch nicht lösen konnte ist, dass ich einer der drei Wörter speichern kann damit dieses Wort dann jedes mal wieder angezeit werden kann.
Nach beiden sachen haben ich mehrere stunden gegooglet aber leider nichts anständiges finden können. Mir würden vieleicht auch schon den Fachbegriff reichen wie man das nennt.Ich hoffe ihr könnt mir da weiter helfen.
Mit freundlichem Gruß
Benkho
-
moin @Benkho
Um deine Funktion direkt nach Programmstart auszuführen kannst du die Funktion einfach aufrufen innerhalb/am Ende des Klassen constructors.
Wird dann direkt ausgeführt, bevor das Ui das erste mal gezeichnet wird.
ZU Punkt 2, du musst dir speichern, ob das Programm schon einmal lief und eine Begrüßung generiert hat oder nicht.
Ich würde QSettings empfehlen.
-
Hallo,
ich bin gerade echt am versweifeln. Ich kann 6 Programmiersprachen für Webseiten und habe mir gedacht, da ich gerade ein wenig mehr Zeit habe, lernste mal C++, wobei ich nicht genau weis ob das bei QT überhaupt C++ ist. Das Problem was ich dabei nur habe ist, dass es nicht anständig irgendwo was erklärt wird so das ich es nachvollziehen kann um es an zu wenden. Vorausgesetzt es ist überhaupt etwas erklärt. Vieleicht muss ich mal etwas umdenken oder nicht so kompliziert denken.
Wo finde ich den Klassen constructors und was bewirk diese? Schreibe ich da alle definitionen rein die das Programm zum start oder zur erstellung benötigt?
-
-
C++ is eine Programmiersprache
-
Qt is eine C++ Bibliothek, d.h. ist in C++ geschrieben und bietet Klassen um die Programmierung von Programmen in C++ zu erleichtern
Du must beides zumindest in Grundzügen beherrschen. Mein C/C++ Buch war damals etwa 1200 Seiten, ein gutes Qt Buch wird die gleiche Größe erreichen. Das heißt nicht, dass du es komplett lesen muss um loszumachen, aber der Weg bis zum Experten ist schon ein Stück.
Aber zu deiner Frage: der Konstruktor der Klasse
MainWindow
hat folgende Funtionssignatur:MainWindow::MainWindow(QWidget *parent)
.Innerhalb der geschweiften Klammern direkt nach dieser Signatur kannst Du die Funktion
CmdPruefenNeuClicked()
aufrufen.Grüße
-
-
@Benkho said in Einmal Random generieren:
int wort_anzahl = sizeof(woerter) / sizeof(woerter[0]);
Should be
int wort_anzahl = sizeof(woerter) / sizeof(char*);
-
Hallo,
vielen vielen Dank ich habe es endlich geschaft das, dass Programm zum start die Begrüßunh anzeigt. Jetzt muss ich mir nur noch das mit dem Speichern ansehen.
Ich habe ein Buch aber das wird es wohl kein gutes sein, da ich solche Sachen dort nicht gefunden habe.
-
@jsulm said in Einmal Random generieren:
char const* woerter[] = { "Hallo", "Hello", "Hay" }; int wort_anzahl = sizeof(woerter) / sizeof(woerter[0]);
Should be
int wort_anzahl = sizeof(woerter) / sizeof(char*);
Why?
P.S.
@Benkho"Hay"
sollte"Hey"
sein! :) -
@JonB Because: sizeof(woerter) == 3 * sizeof(char*) == 12 (on 32bit platforms)
This is dangerous if the array is empty:int wort_anzahl = sizeof(woerter) / sizeof(woerter[0]);
-
@jsulm
I really don't understand! From my C days I have always used a convenient macro like:#define ELEMENTS_IN(array) (sizeof(array) / sizeof(array[0]))
which cannot be written (with one parameter) if one adopts your definition. The advantage of writing it this way is that you do not have to change your definition's
sizeof(char*)
if the type of element in the array is altered and you forget to do so.This is dangerous if the array is empty:
Do you mean, using
sizeof(woerter[0])
ifwoerter
array contains no elements at run time? If so, you are labouring under a misapprehension! :)sizeof
is evaluated at compile-time, not runtime. You can writesizeof(array[0])
, or for that mattersizeof(*array)
, regardless of the size of the the array or whether/what elements it contains. The compiler generates the size of whatever type elements are or would be in the array from its declaration, not its runtime content. -
@JonB Yes, you're right
-
Guten Tag,
ich habe mal nach den QSettings gegoogelt wie ich damit arbeite und habe anhand der dortigen angaben dieses zusammen gebaut aber irgendwie will es nicht ganz funktionieren. Also starten tut das Programm aber es speichert nichts ab.
srand((unsigned)time(NULL)); initGui(); m_sSettingsFile = QApplication::applicationDirPath().left(1) + ":/begrüßungsettings.ini"; loadSettings(); if (LblBegrueßung) { connect(ui->LblBegrueßung, SIGNAL(clicked()), SLOT()); } char const* woerter[] = { "Hallo", "Hello", "Hey" }; int wort_anzahl = sizeof(woerter) / sizeof(char*); int zahl = (rand() % wort_anzahl); ui->LblBegrueßung->setText(woerter[zahl]); } void MainWindow::initGui() { LblBegrueßung = new QLabel("", this); LblBegrueßung->setGeometry(0,0, 200,40); } void MainWindow::loadSettings() { QSettings settings(m_sSettingsFile, QSettings::NativeFormat); QString sText = settings.value("text", "").toString(); if (LblBegrueßung) { LblBegrueßung->setText(sText); } } void MainWindow::saveSettings() { QSettings settings(m_sSettingsFile, QSettings::NativeFormat); QString sText = (LblBegrueßung) ? LblBegrueßung->text() : ""; settings.setValue("text", sText); if (LblBegrueßung) { LblBegrueßung->setText(sText); } } void MainWindow::handleButton() { saveSettings(); }
-
Du suchst QSettings::setValue() - QSettings::value() liest nur Daten aus (wie in der Dokumentation beschrieben
-
@Christian-Ehrlicher
Ich verstehe nicht genau was du meinst? Ich habe doch QSettings::setValue drinne -
@Benkho said in Einmal Random generieren:
begrüßungsettings.ini
ich währe vorsichtig mit Umlauten im Dateipfad. Existiert die Datei überhaupt ? Es sollte auf jedenfalls eine *.ini Datei existieren, auch wenn sie leer ist.
-
@Benkho said in Einmal Random generieren:
Ich habe doch QSettings::setValue drinne
Korrekt, habe load und save verwechselt bzw. verscrollt :)
Sicher dass Du dort auch Schreibrechte hast? -
@J.Hilk
das ü habe ich schon in ue geändert. Ja diese .ini datei exestiert. Ich habe auch mal mit einer .txt datei versucht aber damit will es auch nicht so ganz klappen. -
@Benkho
hier hast du ein funktionierende Beispiel:#include <QApplication> #include <QString> #include <QPushButton> #include <QLineEdit> #include <QHBoxLayout> #include <QSettings> int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget* w= new QWidget(); QHBoxLayout *layout = new QHBoxLayout(w); QLineEdit *le = new QLineEdit(); layout->addWidget(le); QPushButton * btn = new QPushButton("Save"); layout->addWidget(btn); QObject::connect(btn, &QPushButton::clicked, [le]()->void{ QSettings settings("MySettings",QSettings::NativeFormat); settings.setValue("text", le->text()); }); btn = new QPushButton("Load"); QObject::connect(btn, &QPushButton::clicked, [le]()->void{ QSettings settings("MySettings",QSettings::NativeFormat); le->setText(settings.value("text").toString()); }); layout->addWidget(btn); w->show(); return a.exec(); }
Mit Save speicherst du den Text der gerade in dem LineEdit steht und mit Load wird der gespeicherte Text geladen und über das LineEdit angezeigt.
-
Ok, ich habe mal versucht alles andere bei mir raus zu machen und dein Script zu verwenden aber irgendwie will es bei mir nicht funktionieren.
Dann habe ich versucht das Script zu verstehen und auf meinem an zu wenden oder eher zu gucken wo bei mir der fehler liegt aber auch das ist mir nicht gelungen, also alle versuche sind kläglich gescheitert.Das kann doch nicht so schwer sein oder?
Ich guck mir das morgen nochmal genau an.