2014-02-13 2 views
0

Как говорится в названии, я хочу создать объект класса Note и добавить его указатель на список объекта класса Traymenu. Мне не хватает всего, что я думаю, посмотрите, как я называю конструктор Note в newNote traymenus и что я делаю в note.h.Передайте экземпляр класса другому конструктору, который добавляет его объект в список, принадлежащий переданному экземпляру

traymenu.h:

#ifndef TRAYMENU_H 
#define TRAYMENU_H 

#include <QSystemTrayIcon> 
#include <QIcon> 
#include <QPixmap> 
#include <QMenu> //in use for context menu 
#include <QList> 

#include "note.h" 

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

private: 
    QSystemTrayIcon mainIcon; 
    QMenu mainContextMenu; 
    QList<Note> notelist; //List that holds references to Note objects 
          //template argument 1 is invalid 

}; 
#endif // TRAYMENU_H 

traymenu.cpp:

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

Traymenu::Traymenu(){ 
    mainIcon.setIcon(QIcon(QPixmap("C:\\program.png"))); 
    mainIcon.setVisible(true); 
    mainIcon.show(); 

    createMainContextMenu(); 
} 

Traymenu::~Traymenu(){ 
} 

void Traymenu::newNote(){ 
    Note(Traymenu *this); //HOW TO PASS THE TRAYMENU INSTANC TO NOTE??? 
} 

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); 

    //Qt5 new signal connection: http://qt-project.org/wiki/New_Signal_Slot_Syntax 
    QObject::connect(actionNewNote,&QAction::triggered,this,&Traymenu::newNote); 
    QObject::connect(actionExitProgram,&QAction::triggered,this,&Traymenu::exitProgram); 

    mainIcon.setContextMenu(&mainContextMenu); 
} 

note.h:

#ifndef NOTE_H 
#define NOTE_H 

#include <QWidget> 
#include "traymenu.h" 

namespace Ui{ 
class Note; 
} 

class Note : public QWidget 
{ 
public: 
    Note(QWidget *parent = 0, Traymenu *trayMenuIn); 
    ~Note(); 
    void appendNoteToNotelist(); 

private: 
    Q_OBJECT 
    Ui::Note *ui; 
    Traymenu *pTraymenu = &trayMenuIn; //trayMenuIn was not declared in this scope 
             //Why declare a formal parameter? 
}; 
#endif // NOTE_H 

note.cpp:

#include "note.h" 
#include "ui_note.h" 

Note::Note(QWidget *parent, Traymenu *trayMenuIn) : 
    QWidget(parent), 
    ui(new Ui::Note) 
{ 
    ui->setupUi(this); 
    Note::appendNoteToNotelist(); 
} 

Note::~Note() 
{ 
    delete ui; 
} 

void Note::appendNoteToNotelist(){ 
    pTraymenu.append(&ui); 
} 
+0

+1 за предоставление исходного кода, -1 для сброса кода с большим количеством проблем, не связанных с самим вопросом –

ответ

1

Я перечисляю каждую проблему, за которой следует иллюстративный фрагмент вашей ошибки.

  • QObjects не могут быть скопированы. Вы не можете передавать свои экземпляры где угодно. Вы не можете хранить свои экземпляры в контейнерах. QWidgets также являются QObjects. Вы можете передавать объекты QObject только по указателю или по ссылке. Чтобы хранить QObjects в контейнерах, вы должны сохранить QSharedPointer экземпляру, созданному в куче.

    void newNote(QWidget, Traymenu); 
    
  • Вызов delete this внутри метода должно быть сделано с особой тщательностью; за исключением особых обстоятельств, это просто неправильно. Если вы новичок в C++, эмпирическое правило: это всегда неправильно. Если вы хотите удалить экземпляр объекта , вы уверены, что находитесь на куче, вы можете позвонить deleteLater. Он выполнит удаление, как только элемент управления вернется в цикл событий.

  • Типичный способ выхода из приложения - позвонить по телефону qApp->quit().

    QObject::connect(actionExitProgram,&QAction::triggered,this,&Traymenu::exitProgram); 
    
  • Параметры со значениями по умолчанию должны поступать после параметров без значений по умолчанию.

    Note(QWidget *parent = 0, Traymenu *trayMenuIn); 
    
  • При передаче параметра в вызове функции/метода, вам не нужно снова предоставить типы.

    Note(Traymenu *this); 
    
  • При проведении ссылки на QObjects, время жизни которых не контролируется, вы должны использовать QPointer, чтобы избежать оборванных ссылок указателя. QPointer сбрасывает себя до нуля, когда объект удаляется в другом месте, что дает вам чистый крах (в отличие от неопределенного и, возможно, очень вводящего в заблуждение поведения).

    Traymenu *pTraymenu 
    
  • Инициализация членов класса должно быть сделано в списке инициализации. Ваш код ниже, не имеет ничего общего с формальными параметрами:

    Traymenu *pTraymenu = &trayMenuIn; 
    

После всех этих исправлений, и некоторые другие, код выглядит как показано ниже.Вы можете скомпилировать его как автономный, единственный файл - он работает, хотя вы никогда не показываете заметки, поэтому они остаются невидимыми.

#include <QApplication> 
#include <QSystemTrayIcon> 
#include <QIcon> 
#include <QPixmap> 
#include <QMenu> 
#include <QList> 
#include <QPointer> 

// Note.h 

namespace Ui{ 
class Note { 
public: 
    void setupUi(QWidget *) {} // dummy for sscce.org 
}; 
} 

class TrayMenu; 
class Note : public QWidget 
{ 
    Q_OBJECT 
public: 
    Note(TrayMenu *trayMenu, QWidget *parent = 0); 
    ~Note(); 
private: 
    QScopedPointer<Ui::Note> m_ui; 
    QPointer<TrayMenu> m_traymenu; 
}; 

// TrayMenu.h 

class Note; 
class TrayMenu : public QSystemTrayIcon 
{ 
public: 
    TrayMenu(); 
    ~TrayMenu(); 
    void createMainContextMenu(); 
    void newNote(); 
private: 
    QSystemTrayIcon mainIcon; 
    QMenu mainContextMenu; 
    QList<QSharedPointer<Note> > noteList; 
}; 

// TrayMenu.cpp 

TrayMenu::TrayMenu(){ 
    mainIcon.setIcon(QIcon(QPixmap("C:\\program.png"))); 
    mainIcon.setVisible(true); 
    mainIcon.show(); 

    createMainContextMenu(); 
} 

TrayMenu::~TrayMenu() {} 

void TrayMenu::newNote() { 
    QSharedPointer<Note> note(new Note(this)); 
    noteList << note; 
} 

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, qApp, &QCoreApplication::quit); 

    mainIcon.setContextMenu(&mainContextMenu); 
} 

// Note.cpp 

Note::Note(TrayMenu *trayMenu, QWidget *parent) : 
    QWidget(parent), 
    m_ui(new Ui::Note), 
    m_traymenu(trayMenu) 
{ 
    m_ui->setupUi(this); 
} 

Note::~Note() {} 

// main.cpp 

int main(int argc, char ** argv) { 
    QApplication app(argc, argv); 
    TrayMenu menu; 
    return app.exec(); 
} 

#include "main.moc" 
+0

Благодарю Вас за ответ подробно :) – user2366975

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