2014-02-13 4 views
1

В моем проекте создается значок в системном трее, в котором есть контекстное меню. В этом меню я могу щелкнуть и создать как можно больше заметок (например, эти липкие заметки из окон). Однако, когда я закрыл свою последнюю заметку (нажав кнопку закрытия окна), вызывается destruktor ~Traymenu(). Зачем? Объект trayMenu все еще имеет активный элемент, значок systray ... И что также интересно, заключается в том, что деструктор Note::~Note() никогда не вызывается, когда я закрываю окно заметки.Почему деструктор другого объекта называется?

main.cpp:

#include "note.h" 
#include "traymenu.h" 
#include <QApplication> 

int main(int argc, char *argv[]){ 
    QApplication a(argc, argv);  
    Traymenu trayMenu;  
    return a.exec(); 
} 

traymenu.h:

#ifndef TRAYMENU_H 
#define TRAYMENU_H 

#include <QSystemTrayIcon> 
#include <QIcon> 
#include <QPixmap> 
#include <QMenu> 

class Note; 

class Traymenu : public QSystemTrayIcon 
{ 
public: 
    Traymenu(); 
    ~Traymenu(); 
    void createMainContextMenu(); 
    void newNote(); 
    void exitProgram(); 

private: 
    QSystemTrayIcon mainIcon; 
    QMenu mainContextMenu; 
    std::vector<Note *> noteList; 
}; 
#endif // TRAYMENU_H 

traymenu.cpp:

#include "traymenu.h" 
#include "note.h" 
#include <QDebug> 

Traymenu::Traymenu(){ 
    mainIcon.setIcon(QIcon(QPixmap("C:\\program.png"))); 
    mainIcon.setVisible(true); 
    mainIcon.show(); 
    createMainContextMenu(); 
} 
Traymenu::~Traymenu(){ 
    qDebug() << "in ~Traymenu()" << endl; 
} 
void Traymenu::newNote(){ 
    Note *nN; //new pointer to object of class Note 
    nN = new Note(); //Initialize pointer 
    noteList.push_back(nN); //add newly created object to a list 
} 
void Traymenu::exitProgram(){ 
    //delete this; //deletes traymenu object (icon disappears) 
} 
void Traymenu::createMainContextMenu(){ 
    QAction *actionNewNote = mainContextMenu.addAction("Neue Notiz"); 
    mainContextMenu.addSeparator(); 
    QAction *actionExitProgram = mainContextMenu.addAction("Programm beenden"); 
    actionNewNote->setIcon(QIcon("C:\\new.ico")); 
    actionNewNote->setIconVisibleInMenu(true); 
    QObject::connect(actionNewNote,&QAction::triggered,this,&Traymenu::newNote); 
    QObject::connect(actionExitProgram,&QAction::triggered,this,&Traymenu::exitProgram); 
    mainIcon.setContextMenu(&mainContextMenu); 
} 
+0

Похоже проблема ссылка Cicle на меня – Manu343726

+0

Вы не удалять заметки, хранящиеся в векторе. Для каждого 'нового' должен быть' delete'. –

+0

Вы правы, это еще не реализовано. Это должно быть причиной того, что деструктор ноты не вызывается, нормально ... Но тогда почему мой QSystemTrayIcon уничтожен после закрытия последней заметки? Я не понимаю, откуда это. О, но это не только QSystemTrayIcon, все приложение само по себе прекращается. – user2366975

ответ

1

По умолчанию выходит основной цикл обработки событий Qt при закрытии последнего окна , по умолчанию QApplication property quitOnLastWindowClosed

Таким образом, после создания экземпляра приложения, установить, что ложно, что-то вроде:

QApplication a; 
a.setQuitOnLastWindowClosed(false); 
+0

Wohoo, я уже знал об этой настройке, но ничего не знал об этом, спасибо! Тем не менее мне интересно, почему приложению сначала нужно создать окно, которое нужно закрыть после закрытия этого окна, так как вначале нет окон. – user2366975

+0

@ user2366975 Это не имеет смысла ... :). Приложение может закрыться из-за закрытия последнего окна, если есть окна, которые можно закрыть. Или, если вы имеете в виду, как приложение закрывается, если у него нет окон? Возвращаясь из 'main', как в любой программе ... В большинстве случаев требуется вызывать' quit() 'slot основного цикла событий приложения, поэтому возвращается вызов' a.exec(); '. И, если быть конкретным, закрытие последнего окна не выходит из приложения, оно просто делает «a.exec();« return », а программа может делать все, что после этого, ему не нужно выходить. – hyde

Смежные вопросы