Buttons verschwinden lassen
-
Hey Gudden Morgen,
Ich brauch mal eure hilfe! Ich bin jetzt seit 2 Tage mit QT und C++ und allgemein mit Objektorientierter Programmierung beschäftig. Der Anfang war gar nicht so schwer (hatte bis vor 2 Tagen nur erfahrung mit C also nie was Objektorientiertes gemacht) aber jetzt sitzt ich seit 1 Tag vor dem Problem und komme nicht weiter.
Ich möchte durch den klick auf einen Button, alle andern Buttons, bis auf die 4 untersten, verschwinden lassen. Aber ich komm nicht dahinter wie es gehen soll.
hier mal die 3 Codeteile die ich schon habe:
Danke euch schon mal für die Hilfe!
Headerdatei:
#ifndef VIERGEWINNT_H #define VIERGEWINNT_H #include<QWidget> class QPushButton; class PushButton : public QWidget { Q_OBJECT public: PushButton(QWidget *parent = 0); public slots: signals: void clicked(); }; #endif // VIERGEWINNT_H
gamebutton.cpp
#include<QApplication> #include<QPushButton> #include<QObject> #include<QVBoxLayout> #include<viergewinnt.h> #include<QFont> class gamebutton : public QPushButton { public: gamebutton(QPushButton*parent=0); }; gamebutton::gamebutton(QPushButton *parent) :QPushButton(parent) { QPushButton*gamebutton = new QPushButton(); gamebutton->setFont(QFont("Arial", 18, QFont::Bold)); gamebutton->resize(400,100); connect(gamebutton, SIGNAL(clicked()), gamebutton, SLOT(hide())); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(gamebutton); setLayout(layout); }
und die main:
#include <QApplication> #include <QFont> #include <QGridLayout> #include <QPushButton> #include <QWidget> #include <QGridLayout> #include <viergewinnt.h> #include <QLabel> class geslayout : public QWidget { public: geslayout(QWidget *parent = 0); }; geslayout::geslayout(QWidget *parent) :QWidget(parent) { QPushButton *quit = new QPushButton(tr("Beenden")); quit->setFont(QFont("Arial", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT (quit())); QGridLayout *grid = new QGridLayout; for (int column =0; column < 5; ++column) { for (int row =0; row <7; ++row) { QPushButton *gamebutton = new QPushButton; grid->addWidget(gamebutton,row, column); } } QPushButton *start = new QPushButton(tr("Start")); start->setFont(QFont("Arial", 20, QFont::Bold)); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(quit); layout->addLayout(grid); layout->addWidget(start); setLayout(layout); } int main(int argc, char *argv[]) { QApplication app(argc, argv); geslayout widget; widget.show(); return app.exec(); }
-
Ich streich deinen Code mal etwas zusammen:
// .h class QPushButton; class PushButton : public QWidget ... // .cpp class gamebutton : public QPushButton // main class geslayout : public QWidget geslayout::geslayout(QWidget *parent) :QWidget(parent) { /// QPushButton *gamebutton = new QPushButton;
Kann es sein, dass du "Klasse" und "Objekt" etwas durcheinander bringst?
Was in der .h steht, hat gar nix mit dem in der (entsprechenden?) .cpp zu tun, in main kommt wieder ne ganz neue Klasse hinzu.
Deine gamebutton-Klasse macht mit einem Layout auf einem QPushButton GAR KEINEN Sinn...Ich denke, vor Qt solltest du dich erstmal ausführlich mit C++ beschäftigen, da fehlt noch einiges an OOP-Grundlagen.
-
Jo das merk ich auch das da noch einiges an wissen fehlt....hilft nur leider nix. Irgendwie muss ich das alles zum laufen bekommen. Ich versteh ja selbst nicht so genau was ich mache, hab ja bisher alle schritte zusammenkopiert. (aus tutorials ect.) und geschaut das sie das machen was ich will...nur das machen sie leider nicht^^
ich hätte vielleicht 1 Tag wenn überhaupt um mich in C++ und die objektorientierte programmierung einzulesen und ich bezweifle dass das hinhaut.
irgendwelche tipps wie man das alles an 1 Tag hinbekommt? Erfahrungen aus C sind vorhanden.
-
Ich bin mir nicht sicher, aber du erzeugst doch deine Buttons laufzeitlich über den Zeiger? Dann kannst du doch einfach den Destruktor der Buttons aufrufen und update() zum neuzeichen...
-
Da du bisher nur per Copy/Paste weitergekommen bist, würde "helfen" gleichbedeutend zu "fertige Lösung" sein. Alles andere wäre Zeitverschwendung, leider...
Lösungsweg:
Hänge einen Slot an das clicked()-Signal des Buttons. Dort iterierst du Zeilen- und Spaltenweise über alle Buttons und rufst ein hide() auf alle Buttons auf, die verschwinden sollen. Ein delete halte ich für wenig zwecjdienlich, da du die Buttons und deren Connections sicher später wieder verwenden willst. Wie du Zeilen- und Spaltenweise über die Buttons gehen kannst, steht bereits im Konstruktor von geslayout.
Um ein Iterieren zu sparen, kannst du dir auch die Buttons, die verschwinden (und später wieder auftauchen) sollen, in einer QList<QPushButton *> merken.