[Qt4] Widgets werde nicht angezeigt
-
Hi Community,
folgender Code zeigt die Widgets leider nicht im Hauptfenster an, d.h. ich bekomme nur ein leeres Fenster.
converter.h
// converter.h #ifndef CONVERTER_H #define CONVERTER_H #include <QWidget> #include <QPushButton> #include <QLabel> #include <QTextEdit> #include <QGridLayout> #include <QVBoxLayout> class Converter : public QWidget { public: Converter(QWidget *parent=0); private: QPushButton *encBut; QPushButton *decBut; QLabel *descrAsc; // Beschriftung QLabel *descrBin; QTextEdit *ascEdit; QTextEdit *binEdit; QGridLayout *mainLayout; QVBoxLayout *buttonLayout; // En- und Decode übereinander }; #endif
converter.cpp
#include <QtGui> #include "converter.h" Converter::Converter(QWidget *parent) : QWidget(parent) { mainLayout = new QGridLayout; descrAsc = new QLabel("ASCII:"); ascEdit = new QTextEdit; mainLayout->addWidget(descrAsc, 0, 0); mainLayout->addWidget(ascEdit, 1, 0); encBut = new QPushButton("Encode -->"); decBut = new QPushButton("<-- Decode"); buttonLayout = new QVBoxLayout; buttonLayout->addWidget(encBut); buttonLayout->addWidget(decBut); mainLayout->addLayout(buttonLayout, 1, 1); descrBin = new QLabel("Binär:"); binEdit = new QTextEdit; mainLayout->addWidget(descrBin, 0, 2); mainLayout->addWidget(binEdit, 1, 2); }
main.cpp
#include <QtGui> #include "converter.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Converter *window = new Converter; window->show(); return app.exec(); }
Kann mir einer sagen, was ich falsch mache?
Vielen Dank!
~moagnus
-
Hm, hab keine Ahnung von QT, aber dein mainlayout hängt da völlig frei rum.
Du musst das sicher noch dem Fenster übergeben, SetLayout oder so.
Das Fenster muss ja irgendwo her wissen, welches Layout es hat
-
Mußt du nicht noch das MainWidget setzen?
#include <QtGui> #include "converter.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); Converter window; // new brauchst du hier nicht window.show(); app.setMainWidget(&window); return app.exec(); }
Und das GridLayout benötigt noch den Parent:
mainLayout = new QGridLayout(this);
-
Danke euch.
Das "this" hat noch gefehlt.
-
@Th in Qt4 gibt es keine setMainWidget() mehr (nur noch in qt3support). das qmainwindow hat ebenfalls keine herausgehobene stellung mehr. wenn alle fenster geschlossen wurden, wird, wenn du nichts dagegen unternimmst, das programm beendet oder anders: alle fenster, die nicht explizit als unwichtig eingestellt sind, verhalten sich wie das alte mainwidow.
-
Ich schreibe jetzt hier einfach mal weiter, da es sich meiner Meinung nicht rentiert, wegen so 'ner Aufgabe das Forum mit noch 'nem Thread zuzuspammen...
Ich hab mal ein bisschen weitergetippt und mittlerweile auch die Methode, die von ASCII nach binär konvertiert, richtig implementiert. Nur "decode()" bereitet noch einige Probleme, die vermutlich daher rühren, dass ich nicht richtig mit den verschiedenen Zeichensätzen umgehe.
decode():
void Converter::decode() { ascEdit->setText(""); QString binString = binEdit->toPlainText(); QString ascString = ""; int i=0, j; const int ASCII = 7; QString temp; // für 7 Bit im String-Format while(i<binString.size()) { for(j=0; j<ASCII; ++j) { // 7 Bit einlesen und verarbeiten temp += binString.at(i+j); } i+=(j+1); // um 7 Bit nach vorne rücken, d.h. i zeigt auf Bit Nr. 7 bool ok; int tempInt = temp.toInt(&ok, 2); char ch = tempInt; ascString += ch; } ascEdit->setText(ascString); }
Das unerwünschte Verhalten hierbei ist, dass nur ein Zeichen richtig vom Binären ins ASCII-Format zurückkonvertiert wird. Die nachfolgenden Nullen und Einsen produzieren nur kryptische Zeichen, die eigentlich gar nicht in der ASCII-Tabelle vorkommen.
Kann mir da jemand weiterhelfen und erklären, wie ich den Char "ch" richtig dem Unicode-String ascString hinzufügen kann.Danke wie immer im Voraus
-
Doch da lohnt sich ein eigener Topic.
-
spontan würde ich sagen, dass deine umrechnungsformel murks ist.
du wandelst da einen string bspw: "010101" in die zahl (10101)_10 (im dezimlsystem) um und kastrierst sie dann auch 8 bit. -> (01110101)_2 ergibt also (117)_10 und nicht (21)_10.
du müsstest deine binärzahlen eher so umwandeln:
unsigned int temp=0; for (j=0; j<ASCII; ++j) { // 7 Bit einlesen und verarbeiten if (binString.at(i+j)=='1') temp+=1; temp=<<1; } char ch=temp; //da wird der compiler nörgeln, aber wen stört es. ;) ascString=ch;
-
Ich habs noch ein bisschen abgeändert, da ich bspw. rausgefunden habe, dass beim letzten eingelesenen Bit nicht mehr mit 2 multipliziert werden darf.
Der Code sieht also nun so aus:
int i=0, j; const int ASCII = 7; unsigned int temp=0; while(i<binString.size()) { for(j=0; j<ASCII; ++j) { // 7 Bit einlesen und verarbeiten if (binString.at(i+j)=='1') temp+=1; if(j!=ASCII-1) temp = temp<<1; // *2^1 } i+=(j+1); char ch=temp; //da wird der compiler nörgeln, aber wen stört es. ;) ascString+=ch; }
Am Problem hat sich aber leider immer noch nichts geändert. Es wird also das erste Zeichen immer noch richtig rückkonvertiert, alle nachfolgenden Bits jedoch produzieren wieder nur Wirrwarr.
Die Umrechnungsmethode müsste jetzt eigentlich stimmen und das Problem irgendwo anders liegen, da ja zwei verschiedene Ansätze das gleiche fehlerhafte Ergebnis produzieren.
-
[...] const int ASCII = 7; while(i<binString.size()) { unsigned int temp=0; //<- dahin, sonst wird temp weiter hochgezählt. [...]
-
Thx, jetzt hats geklappt. Ein Fehler lag auch noch bei "i+=(j+1);" das war immer genau eins zu viel.
Edit: Und für alle Zeichen, die im Binärformat mit einer Null beginnen, muss dem String in der Funktion encode() noch eine '0' hinzugefügt werden.