Windows7,Qt: Neuer Eingabedialog funktioniert nicht

kannaum

Mitglied
Hallo,

Schon wieder ich ;-)
Habe wieder ein Problem.
Diesmal wollte ich einen Dialog auf Knopfdruck auf einen Menüeintrag aufrufen.
Der Wt Creator führt mir das Programm ohne Probleme aus, aber wenn ich auf Neu klicke tut sich gar ncihts.

Hier der Menüeintrag:
Code:
    fileMenu->addAction(tr("&Neu"), qApp, SLOT(neu()),QKeySequence(tr("F1", "Neu")));

Und noch die Funktion neu():
Code:
void mathematik::neu() {
    bool ok;
QStringList items;
items << "Turm";
QString itemvalue = QInputDialog::getItem(
   this,"QInputDialog::getItem()","Was möchten sie machen?",
   items, 0, false, &ok );
if(ok) {
   QMessageBox::information(
           this, "Sie wählten:", itemvalue,
      QMessageBox::Ok );
}
}


Ich hoffe ihr könnt mir helfen.

mfg
 
Ok hier die Datei mathematik.h:
Code:
#ifndef MATHEMATIK_H
#define MATHEMATIK_H
#include <QWidget>
#include <QMainWindow>
#include <QTextEdit>
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QMessageBox>
#include <QInputDialog>
#include <QObject>
#include <QLabel>
#include <QVBoxLayout>
#include <QPushButton>
class mathematik : public QMainWindow {
Q_OBJECT
public:
    mathematik( QMainWindow *parent = 0, Qt::WindowFlags flags = 0);
public slots:
    void neu();
};

#endif // MATHEMATIK_H


mathematik.cpp:

Code:
#include "mathematik.h"
#include <QApplication>
#include <QInputDialog>
#include <QMessageBox>

mathematik::mathematik( QMainWindow *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) {
    setWindowTitle("Notizen");
    QMenu *fileMenu = new QMenu(tr("&Datei"), this);
    menuBar()->addMenu(fileMenu);
    fileMenu->addAction(tr("&Neu"), qApp, SLOT(neu()),QKeySequence(tr("F1", "Neu")));
    fileMenu->addAction(tr("&Beenden"), qApp, SLOT(quit()),QKeySequence(tr("F4", "Beenden")));

}

void mathematik::neu() {
    bool ok;
QStringList items;
items << "Turm";
QString itemvalue = QInputDialog::getItem(
   this,"QInputDialog::getItem()","Was möchten sie machen?",
   items, 0, false, &ok );
if(ok) {
   QMessageBox::information(
           this, "Sie wählten:", itemvalue,
      QMessageBox::Ok );
}
}


Und noch die main.cpp:
Code:
#include <QApplication>
#include "mathematik.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    mathematik* window = new mathematik;
    window->show();
    return app.exec();
}

Version ist 4.6.0

mfg
 
Hi.

Dieser Fehler ist dir wohl nicht aufgefallen?
Code:
Object::connect: No such slot QApplication::neu() in .\mathematik.cpp:10
neu() ist ein Slot der mathematik Klasse, nicht einer qApp Instanz.
C++:
fileMenu->addAction(tr("&Neu"), this, SLOT(neu()), QKeySequence(tr("F1", "Neu")));
Gruß
 
Danke, jetzt gehts.
Habe das übersehen, da das Programm ausgeführt wurde, also habe ich da nciht hingeschaut.
Nochmal vielen Dank.

mfg
 
Und wie kann ich jetzt statt dem Dialog zb. einen Button im Hauptfenster anzeigen lassen.
Habe das wohl schon probiert, aber es funktioniert nicht,
Habe einfach probiert statt dem Dialog bei
Code:
if(ok) {
   
}
einen Button eizufügen, aber da hat isch ga nichts getan.

mfg
 
Habe das wohl schon probiert, aber es funktioniert nicht,
einen Button eizufügen, aber da hat isch ga nichts getan.

mfg

Ok und wie bzw. was genau hast du da probiert hinzuschreiben? Soll sich dieser Button als eigenes Fenster öffnen?

Kann es sein das du es wie folgt versucht hast?

Code:
if(ok) {
   QPushButton button("TestButton"); 
   button.show();
}

Wenn ja, dann kann es nicht funktionieren, da die Instanz des Buttons nachdem Durchlauf des Konstruktors gelöscht wird, da lokale Variablen außerhalb ihres Gültigkeitsbereichs nicht mehr existieren. Du wirst i. d. R. von dem show() Aufruf garnichts mitbekommen, da es viel zu schnell passieren sollte.

Hier hast du die Möglichkeit so ein PushButton als Zeiger anzulegen, wenn du den Button auf dein Haupt-Widget platzieren möchtest kannst du über Angabe des Parents eine Parent/Child-Beziehung aufbauen und somit musst du dich nicht um das Löschen des Buttons kümmern .

Code:
if(ok) {
   QPushButton *button = new QPushButton(this, "TestButton");
}

Wenn du aber den Button als eigenes Fenster öffnen willst, musst du den Button als Member- oder Zeigervariable in der Klasse anlegen und den entweder über die Parent/Child-Verbindung oder durch das löschen (mit delete) im Destruktor löschen.

Etwas mehr Informationen zu deinem Vorhaben würden diese Rätzelraterei erheblich verkürzen...


Gruß
RudolfG
 
Zuletzt bearbeitet:
Zurück