Seite 1 von 1

Problem mit Contexmenu

Verfasst: 26. März 2010 00:12
von MSchuster
Leider werde ich aus der Anleitung von Trolltech sowie aus meinem Buch QT 4.6 nicht schlau bzw es will nicht funktionieren :lol:

bei Trolltech steht:

Code: Alles auswählen

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu(this);
    menu.addAction(showAdresse);
    menu.exec(event->globalPos());
}
Im Buch steht:

Code: Alles auswählen

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu *menu = new QMenu(this);
    menu->addAction(showAdresse);
    menu->exec(event->globalPos());
}
Kann mir wer sagen was nur korrekt ist (QMenu menu(this); oder QMenu *menu = new QMenu(this);

Ein weiteres Problem habe ich das ich wenn ich im Mainwindow irgendwo rechtsklicke sich das Programm aufhängt.

Hier mal mein Code:

Headerfile

Code: Alles auswählen

protected:
    void changeEvent(QEvent *e);
    bool eventFilter(QObject *object, QEvent *event);
    void contextMenuEvent(QContextMenuEvent *event);

private:
    Ui::MainWindow *ui;
    void createActions();
    QAction *showAdresse;

private slots:
    void zeigeAdresse();
cpp file

Code: Alles auswählen

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu *menu = new QMenu(this);
    menu->addAction(showAdresse);
   // menu->addAction(showVertraege);
   // menu->addAction(showSchaden);
    menu->exec(event->globalPos());
}

void MainWindow::zeigeAdresse()
{
    QMessageBox::information(0,"Title..","zeige Adresse");
}

void MainWindow::createActions()        //ContexMenu Person
{
    QAction *showAdresse = new QAction(this);
    showAdresse->setStatusTip("Zeigt alle Adressen an....");
    connect(showAdresse, SIGNAL(triggered()),this,SLOT(zeigeAdresse()));
}
weiters will ich das Contexmenu nur in nen QTableView aktivieren welches ich aber mit dem QT-Creator erstellt habe. In den Büchern bzw. Anleitungen wird es aber immer nur so erklärt wenn man die Komponenten per Code erstellt. Wie macht man das wenn man den Creator verwendet??

Sind viele Fragen aber bei Learning by doing kommt das schon mal vor :roll:

Thx für Antworten

Verfasst: 26. März 2010 07:34
von franzf
Tjo, wenn das bei Trolltech so steht würd ich es auch so machen.
Du hast nämlich sinnigerweise einen Memoryleak in der anderen Version...

Ansonsten beschreibe "hängt sich auf" etwas genauer.
Gibts nen Segfault? -> Mit Debugger durchgehen.
Tut sich einfach nix mehr? -> Sollte auch mit Debugger gehen.

Sollte dich das nicht weiterbringen, kannst du ja dein (kompilierbares!) Projekt als ZIP anhängen.

Verfasst: 26. März 2010 12:57
von MSchuster
So hab mal das Project upgeloadet auf http://members.chello.at/delphi-developer/VersMax.rar

Thx für alles

Verfasst: 26. März 2010 13:18
von franzf
1) BITTE die Binaries rausnehmen! Nicht alle sitzen an einer hypermodernen schnellen Internetverbindung (so wie ich...) Da wartet man auf 4MB schon mal >1min...
Zu allem Überfluss hab ich nichtmal ein Windows (so wie wohl viele hier), da bringt einem ein Windows .exe oder .dll nix.

2) Mit nem Debugger wärst du da ruckzuck dahinter gekommen! Schau dir das für die Zukunft nochmal an, wie das geht...

Code: Alles auswählen

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6ea084e in QList<QWidget*>::append(QWidget* const&) () from /usr/lib64/qt4/libQtGui.so.4
(gdb) bt
#0  0x00007ffff6ea084e in QList<QWidget*>::append(QWidget* const&) () from /usr/lib64/qt4/libQtGui.so.4
#1  0x00007ffff6edda64 in QWidget::insertAction(QAction*, QAction*) () from /usr/lib64/qt4/libQtGui.so.4
#2  0x0000000000406371 in MainWindow::contextMenuEvent(QContextMenuEvent*) ()
[ U S W]
SegFault ausgehend vom contextMenuEvent also.
Dann schut man sich kurz an was man da murkst, dann kommt man auf die Lösung:

3) Du solltest deine Pointer initialisieren... Segfault heißt eigentlich immer, dass der Zeiger Default-Initialisiert ist also irgendwo hinzeigt), oder mit NULL initialisiert. Das Ende ist jeweils das Selbe.
Du musst deine "QAction *showAdresse" im Konstruktor initialisieren!!!

Verfasst: 26. März 2010 18:43
von MSchuster
Danke bin nun auf meinen Fehler gekommen. Das mit dem Debugen funkt bei mir irgendwie nicht --> muss ich mir wirklich dringend anschauen wie das in Qt funktioniert.