2017-02-28 3 views
0

이라는 QMessageBox 하위 클래스를 만들었으므로 특정 작업을 하위 클래스의 생성자에서 수행하려고합니다.하위 클래스 QMessageBox 정적 API

헤더 :

#ifndef CUSTOMQMESSAGEBOX_H 
#define CUSTOMQMESSAGEBOX_H 
#include <QMessageBox> 

class CustomQMessageBox : public QMessageBox 
{ 
public: 
    CustomQMessageBox(); 
}; 

#endif // CUSTOMQMESSAGEBOX_H 

CPP : 나는 CustomQMessageBox의 인스턴스를 만들 때 생성자가 호출

#include "customqmessagebox.h" 

CustomQMessageBox::CustomQMessageBox() 
{ 
    qDebug() << "yo"; 
} 

qDebugyo을 말한다 여기 내 클래스입니다. 그러나 정적 API 메서드를 호출하면 생성자가 호출되지 않습니다.

//constructor is called 
CustomQMessageBox cbox; 

//constructor is not called 
CustomQMessageBox::question(this, "Title", "Question?", QMessageBox::Yes | QMessageBox::No); 
내가 QMessageBox의 정적 인 방법을 사용할 때 왜 생성자가 호출되지 않는

?

감사합니다.

+0

정적 방법은과 관련있는 클래스의 객체를 생성하지 않습니다. 당신이 싱글 톤 또는 뭔가를 만들지 않는 한. – vincent

+0

@vincent 그래서 내 하위 클래스에 정적 메서드를 사용할 수 없습니까? – mrg95

+0

정적 일 수도 있지만 인스턴스화 된 클래스와 관련된 변수는 액세스 할 수 없습니다. 너 뭐하려고? – vincent

답변

-1

QMessageBox에서 파생 된 자주 사용하는 클래스입니다. 생성자를 사용하여 사용자 정의 버튼을 시작할 수 있습니다. 그리고 좀 더 구체적인 것을 필요로한다면 당신은이 수업에서 파생 될 수 있습니다.

버튼 역할을 얻으려면 messageBox-> buttonRole (QAbstractButton * buttonInQuestion)을 호출 할 수 있습니다.

헤더.

#ifndef MESSAGEBOX_H 
#define MESSAGEBOX_H 

#include <QMessageBox> 
#include <QPushButton> 

class MessageBox : public QMessageBox 
{ 
    Q_OBJECT 

public: 
    MessageBox(QWidget* parent, const QString& title, const QString& text, 
       QMessageBox::Icon icon = QMessageBox::NoIcon, 
       const QString& btnText1 = "", QMessageBox::ButtonRole btnRole1 = QMessageBox::AcceptRole, 
       const QString& btnText2 = "", QMessageBox::ButtonRole btnRole2 = QMessageBox::InvalidRole, 
       const QString& btnText3 = "", QMessageBox::ButtonRole btnRole3 = QMessageBox::InvalidRole); 
    virtual ~MessageBox(); 

    virtual QPushButton* addButton(const QString& btnText, QMessageBox::ButtonRole btnRole); 
    QPushButton* button(const unsigned int& index) const; 
    bool clicked_button(const unsigned int& index) const; 

private: 
    QPushButton *_button1; 
    QPushButton *_button2; 
    QPushButton *_button3; 
}; 

#endif // MESSAGEBOX_H 

클래스

#include "messagebox.h" 

MessageBox::MessageBox(QWidget* parent, const QString& title, const QString& text, 
         QMessageBox::Icon icon, 
         const QString& btnText1, QMessageBox::ButtonRole btnRole1, 
         const QString& btnText2, QMessageBox::ButtonRole btnRole2, 
         const QString& btnText3, QMessageBox::ButtonRole btnRole3) 
    : QMessageBox(icon, title, text,QMessageBox::NoButton, parent), 
     _button1(0), _button2(0), _button3(0) 
{ 
    _button1 = addButton(btnText1, btnRole1); 
    _button2 = addButton(btnText2, btnRole2); 
    _button3 = addButton(btnText3, btnRole3); 
} 

MessageBox::~MessageBox() { 

} 

QPushButton* MessageBox::addButton(const QString& btnText, QMessageBox::ButtonRole btnRole) { 
    if (btnRole != QMessageBox::InvalidRole) { 
     if (btnText.compare("") != 0) { 
      return QMessageBox::addButton(btnText, btnRole); 
     } else { 
      QString stdText("?"); 
      switch (btnRole) { 
      case QMessageBox::AcceptRole: stdText = tr("&OK"); break; 
      case QMessageBox::RejectRole: stdText = tr("&Cancel"); break; 
      case QMessageBox::YesRole: stdText = tr("&Yes"); break; 
      case QMessageBox::NoRole: stdText = tr("&No"); break; 
      default: break; 
      } 
      return QMessageBox::addButton(stdText, btnRole); 
     } 
    } 
    return 0; 
} 

QPushButton* MessageBox::button(const unsigned int& index) const { 
    switch(index) { 
    case 0: return _button1; 
    case 1: return _button2; 
    case 2: return _button3; 
    default: return 0; 
    } 
} 

bool MessageBox::clicked_button(const unsigned int& index) const { 
    return this->clickedButton() == button(index); 
} 

사용 예 ...

MessageBox msg(0, tr("Add Icon"), tr("Icon list already contains this icon!"), QMessageBox::Warning); 
    msg.exec() 
+0

답변 해 주셔서 감사합니다! 나는 당신의 접근법을 좋아하지만, 이것이 내가가는 길인지 아직 확실하지 않습니다. 선택한'QMessageBox :: StandardButton'을 반환하지 않습니다? – mrg95

+0

msg-> standardButton (QAbstractButton * btn)을 호출 할 수 있습니다. 이러한 이유로 특정 단추를 클래스에서 검색 할 수 있습니다. – vincent

+0

필자는 모든 정적 호출을 수정하고 단추의 이름을 지정하고 exec를 호출하고 msg-> standardButton 등을 호출해야한다면이 접근 방식이 실제로 작업을 훨씬 쉽게 만든다고 생각합니다. 클래스를 인스턴스화하고 속성 API를 사용하는 것이 좋습니다. 정적 호출의 단순함을 고맙게 생각합니다. 색상 및 내용을 변경하고 싶습니다. P – mrg95