QT Ausgabe (Datentypen)
-
Hey,
Sitze jetzt schon eine Weile dran und will eigentlich "nur" den Inhalt eines Char-Arrays in meiner QT-Gui in einem Feld ausgeben.
Wenn ich keine Typumwandlung zu "QChar" oder "QString" mache bekomme ich einen Fehler, wenn ich es tue bekomme ich aus irgendeinem Grund zufällig Buchstaben. Jedes mal wenn ich das Programm neustarte ist es ein neuer.
Weiß jemand wie ich den Inhalt eines Arrays in meiner GUI ausgeben kann?
Zusatz-Info: Ich versuche grade zur Übung Schiffe versenken zu programmieren. Funktioniert auch schon in der Konsole und will nun eine GUI dazu basteln.
Die Ausgabe soll also nur chars enthalten wie z.B. 'x' oder '~', so in der Art.Danke schonmal!
Gruß Dominic
-
Zeig mal Code.
-
#ifndef QT_PROJECT_H #define QT_PROJECT_H #include <QtWidgets/QMainWindow> #include "ui_qt_project.h" #include "mainClass.h" class QT_Project : public QMainWindow { Q_OBJECT public: QT_Project(QWidget *parent = 0); ~QT_Project(); private: Ui::QT_ProjectClass ui; // begin new code public slots: void on_btnHello_clicked() { mainClass mc; QString feld_clicked[5][5]; feld_clicked[5][5] = mc.feld_mainClass[5][5]; ui.btnHello->setText("Hi!"); QString text = ui.lineInput->text(); QChar feld = (QChar)mc.feld_mainClass[1][1]; ui.textBrowser->insertPlainText(feld); ui.textBrowser->insertPlainText("Hayho"); } // end new code }; #endif // QT_PROJECT_H
Das ist der Code aus meinem qt_project.h Header. Der wurde automatisch angelegt, ich hab dann lediglich den Code bei public slots ausgebaut.
mc.feld_mainClass ist ein char array übrigens.
Ich habe das mal in einer Klasse als public deklariert so dass ich darauf zugreifen kann. Weiß nicht ob das programmiertechnisch optimal ist, aber für den Zweck hier sollte es glaub ich eigentlich funktionieren.
-
Ok, ich glaub, ich verstehe was du willst. So wirklich optimal ist aber irgendwie nicht. Warum greifst du jeweils auf den Index [5][5] zu? Willst du nicht irgendwie alle darstellen?
Da du eine Matrix fester Größe hast, würde sich einfach eine Schleife anbieten, die über alle Elemente drüberläuft und die ausgibt.
Der Cast nach QChar schaut auf jeden Fall komisch aus und sollte unnötig sein.
-
Ich wollte erstmal ein Feld ausgeben und wenn das funktioniert eine Schleife bauen Der Cast ist drin weil ich eine ganze Weile schon rumprobiert habe Und irgendwie wird das Feld wie gesagt eben nicht ausgegeben wegen einem falschen Typ oder wenn ich wie hier QChar verwende wird ein zufälliger Buchstabe ausgegeben, was ich nicht ganz verstehe.
Hier mal der Code in dem ich das Array befülle. Eigentlich eine simple Schleife die alle Felder mit 'a' füllen soll.
#include "functionClass.h" char functionClass::feldBefuellen(char feld[5][5]) { for (int i = 0; i < 5; i++) { for (int z = 0; z < 5; z++) { feld[i][z] = 'a'; } } return feld[5][5]; }
-
Mein Array das ausgegeben wird erhält seinen Inhalt ja aus einem anderen Array. Da ich mir nicht sicher war ob ich diese Datenübertragung richtig gemacht habe, habe ich mal eine Schleife gebaut die jedes Feld einzeln überträgt.
public slots: void on_btnHello_clicked() { mainClass mc; QChar feld_clicked[5][5]; for (int i = 0; i < 5; i++) { for (int z = 0; z < 5; z++) { feld_clicked[i][z] = mc.feld_mainClass[i][z]; } } //feld_clicked[5][5] = mc.feld_mainClass[5][5]; ui.btnHello->setText("Hi!"); QString text = ui.lineInput->text(); ui.textBrowser->insertPlainText(feld_clicked[5][5]); //ui.textBrowser->insertPlainText("Hayho"); }
Nun erhalte ich zwar eine Ausgabe aber nur ein Symbol anstatt 'a'.
Stimmt da vielleicht der Zeichensatz nicht? Aber eigentlich will ich ja nur ein normales a ausgeben.http://www.pic-upload.de/view-27408877/QT_Screenshot.png.html
Hier ein Screenshot von der Ausgabe momentan
-
Deine ständigen [5][5] Zugriffe sind falsch, deine Arrays haben doch nur 5 Elemente, also ist der letzte Index 4. Deine Schleifen machst du aber immer richtig. Deswegen steht an der Adresse 5 auch was zufälliges drin.
-
Stimmt da hast du natürlich recht.
Aber hab mittlerweile zwei Schleifen. Die sollten stimmen und jedes Feld ausgeben. Aber bekomme nun auch für jedes Feld Hieroglyphen anstatt meines 'a' char
public slots: void on_btnHello_clicked() { mainClass mc; QChar var; QChar feld_clicked[5][5]; for (int i = 0; i < 5; i++) { for (int z = 0; z < 5; z++) { feld_clicked[i][z] = (QChar)mc.feld_mainClass[i][z]; } } //feld_clicked[5][5] = mc.feld_mainClass[5][5]; ui.btnHello->setText("Hi!"); QString text = ui.lineInput->text(); for (int i = 0; i < 5; i++) { ui.textBrowser->insertPlainText("\n"); for (int z = 0; z < 5; z++) { feld_clicked[i][z] = mc.feld_mainClass[i][z]; ui.textBrowser->insertPlainText(feld_clicked[i][z]); } }
-
Überleg mal genau, ob und welchen Sinn "mainClass mc;" macht!
-
Hey Th69
"MainClass mc;" brauch ich ja um mein Array aus meiner anderen Klasse zu bekommen, denn das wollte ich nicht hier lokal füllen wo ich das GUI baue/ändere. Und um darauf zugreifen zu können benötigt ich, soweit ich dass in C++ weiß, ein Objekt der entsprechenden Klasse.
Ob eine MainClass bei meinem Projekt effektiv Sinn macht ist wieder was anderes, aber ich wollte mein Projekt in übersichtliche Klassen aufteilen.Für Tipps die vielleicht allgemein meinen Code verbessern wäre ich natürlich auch dankbar Wie gesagt fange erst mir C++ an und versuche Stück für Stück mehr Struktur und Ordnung in den Code zu bringen.
Aber das Hauptproblem ist leider immernoch die Ausgabe Oder hat jemand eine komplett andere Idee vielleicht sogar, wie ich ein einfaches Char Array auf meiner GUI ausgeben kann?
EDIT: Das Problem der zufälligen Ausgabe erfolgt auch wenn ich ein feld wie [1][1] was ja im Bereich liegen sollte in eine QChar Variable lese und dann ausgebe. Vielleicht stimmt da was mit der Übernahme von Array Inhalten in den Typ QChar oder ähnlich nicht.
-
Also wenn ich lokal ein Array erstelle und es ebenfalls lokal fülle, dann gibt er es korrekt aus. Vielleicht liegt das Problem da, dass ich in einigen Methoden nicht "QChar" sondern nur "char" verwenden kann oder ein include fehlt.
Aufjedenfall scheint es an der Übergabe zu liege und dass dort ein Fehler unterläuft.
-
Danke für die Beteiligung an diesem Thread
Es funktioniert jetzt. Die Lösung war eigentlich relativ simple wenn man den Fehler erst eingegrenzt hat. Obwohl die Lösung jetzt nicht ganz so strukturiert ist wie ich es wollte. Ich schreib hier eine kleine Lösunghilfe, falls jemand mal das selbe Problem hat Hoffe es hilft.Das Problem lag anscheinend an der Übergabe meines Arrays. Daher muss man das Array lokal anlegen.
Nun habe ich im Header lediglich einen Prototype der Funktion (ohne body) erstellt und diese in der zum Header gehörigen .cpp Datei ausgebaut. Dabei erstelle ich in der .cpp Datei ein Array und lasse dieses über die Methode füllen. Da das Array nun gleich als "QChar" deklariert und nicht durch verschiedene "char" Methoden geschleust wird, wird auch alles richtig ausgegeben.
Header-Code:
#include "mainClass.h" #include "functionClass.h" class QT_Project : public QMainWindow { Q_OBJECT public: QT_Project(QWidget *parent = 0); ~QT_Project(); private: Ui::QT_ProjectClass ui; // begin new code public slots: void on_btnHello_clicked(); //ui.textBrowser->insertPlainText("Hayho"); // end new code }; #endif // QT_PROJECT_H
Cpp-Code:
#pragma once #include "qt_project.h" QT_Project::QT_Project(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); } QT_Project::~QT_Project() { } void QT_Project::on_btnHello_clicked() { QChar charArray[5][5]; for (int i = 0; i < 5; i++) { for (int z = 0; z < 5; z++) { charArray[i][z] = 'a'; } } for (int i = 0; i < 5; i++) { ui.textBrowser->insertPlainText("\n"); for (int z = 0; z < 5; z++) { ui.textBrowser->insertPlainText(charArray[i][z]); } } Ui::QT_ProjectClass ui; }
Wie ich damit nun weiterarbeite muss ich mal schauen, aber die Ausgabe funktioniert schonmal
Vielen Dank nochmal!
-
Wieso postest du eine Frage zu Qt im C++/CLI Forum?
-
DDyrdek1992 schrieb:
Die Lösung war eigentlich relativ simple wenn man den Fehler erst eingegrenzt hat.
Dir fehlen noch ganz massiv C++ Grundlagen. Dein "mainClass mc;" erzeugt eine neue Instanz von mainClass. Damit bekommst du nicht das Array, das du irgendwo anders initialisiert hattest. Wahrscheinlich ist das auch uninitialisiert, deswegen zufällige Zeichen. Wo du was initialisierst und weitergibst, musst du dir schon genauer überlegen. Das ist übrigens nicht unbedingt nur ein Anfängerfehler (in der Form natürlich schon), auch später ist es oft die entscheidende Frage, wie man sein Programm aufteilt und wo was verwaltet und weitergegeben wird.