2017-02-28 103 views
0

我创建了QMessageBox的子类CustomQMessageBox,我想要在子类的构造函数中发生某些操作。这里是我的课:子类化QMessageBox静态API

页眉:

#ifndef CUSTOMQMESSAGEBOX_H 
#define CUSTOMQMESSAGEBOX_H 
#include <QMessageBox> 

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

#endif // CUSTOMQMESSAGEBOX_H 

.cpp的:

#include "customqmessagebox.h" 

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

当我创建的CustomQMessageBox实例调用构造函数和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