2010-09-16 17 views
1
QString QInputDialog::getText (QWidget * parent, const QString & title, 
    const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, 
    const QString & text = QString(), bool * ok = 0, 
    Qt::WindowFlags flags = 0) [static] 

Cette fonction est définie pour appeler une boîte de dialogue Obtenir et renvoyer le texte qui sera inséré dans une édition de QLine. Donc, je veux créer une méthode statique getData qui renvoie une structure de données (disons QPair) et fonctionne comme QInputDialog::getText(). J'ai essayé mais je ne pouvais pas faire ça. Comment puis je faire ça?Comment puis-je ajouter une méthode statique à un QInputDialog pour renvoyer des données personnalisées?

+0

vous cherchez à modifier la classe QInputDialog elle-même? – jrharshath

+0

Pourriez-vous être plus précis sur ce que vous essayez de faire? Voulez-vous entrer deux chaînes que vous souhaitez stocker dans un QPair? –

+0

Oui, je veux entrer deux chaînes que je voudrais stocker dans un QPair. – Narek

Répondre

1

Je l'ai fait, mais je poster pour les personnes qui ont besoin de cela. Voici un exemple d'une boîte de dialogue, qui sert à redimensionner une image. Pour être plus précis, il s'agit de représenter l'utilisateur à la taille actuelle d'une image et lui fournir une interface pour changer la taille et obtenir la nouvelle taille avec un QPair.

class ResizeImageDialog : public QDialog 
{ 
    Q_OBJECT 

double     m_ratio; 

QLabel     *m_widthLabel; 
QLabel     *m_hightLabel; 
QDoubleSpinBox   *m_widthSpinBox; 
QDoubleSpinBox   *m_hightSpinBox; 
QCheckBox    *m_keepRatioCheckBox; 

QPushButton    *m_okButton; 
QPushButton    *m_cancelButton; 

QHBoxLayout    *m_widthLayout; 
QHBoxLayout    *m_hightLayout; 
QHBoxLayout    *m_buttonLayout; 
QVBoxLayout    *m_generalLayout; 

private slots: 
    void widthChanged(double width); 
    void hightChanged(double hight); 

public: 
    ResizeImageDialog(QWidget * parent = 0, double imageWidth = 100.0, double imageHight = 100.0):QDialog(parent) 
    { 
    m_widthLabel = new QLabel("Image width"); 
    m_hightLabel = new QLabel("Image hight"); 

    m_widthSpinBox = new QDoubleSpinBox; 
    m_widthSpinBox->setMaximum(1500); 
    m_widthSpinBox->setValue(imageWidth); 
    connect(m_widthSpinBox, SIGNAL(valueChanged(double)), this, SLOT(widthChanged(double))); 


    m_hightSpinBox = new QDoubleSpinBox; 
    m_hightSpinBox->setMaximum(1500); 
    m_hightSpinBox->setValue(imageHight); 
    connect(m_hightSpinBox, SIGNAL(valueChanged(double)), this, SLOT(hightChanged(double))); 

    m_ratio = imageWidth/imageHight; 


    m_keepRatioCheckBox = new QCheckBox("Keep ratio",this); 
    m_keepRatioCheckBox->setChecked(true); 


    m_widthLayout = new QHBoxLayout; 
    m_widthLayout->addWidget(m_widthLabel); 
    m_widthLayout->addWidget(m_widthSpinBox); 

    m_hightLayout = new QHBoxLayout; 
    m_hightLayout->addWidget(m_hightLabel); 
    m_hightLayout->addWidget(m_hightSpinBox); 

    m_okButton = new QPushButton("OK"); 
    connect(m_okButton, SIGNAL(clicked()), this, SLOT(accept())); 

    m_cancelButton = new QPushButton("Cancel"); 
    connect(m_cancelButton, SIGNAL(clicked()), this, SLOT(reject())); 

    m_buttonLayout = new QHBoxLayout; 
    m_buttonLayout->addStretch(); 
    m_buttonLayout->addWidget(m_okButton); 
    m_buttonLayout->addWidget(m_cancelButton); 

    m_generalLayout = new QVBoxLayout; 
    m_generalLayout->addLayout(m_widthLayout); 
    m_generalLayout->addLayout(m_hightLayout); 
    m_generalLayout->addWidget(m_keepRatioCheckBox); 
    m_generalLayout->addLayout(m_buttonLayout); 
    setLayout(m_generalLayout); 

    setMaximumSize(300, 300); 
    setModal(true); 
    //resize(670,630); 
    setWindowTitle(tr("Resize Image")); 
    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); 
} 

static QPair<double, double> getNewSize(QWidget * parent = 0, double imageWidth = 100.0, double imageHight = 100.0) 
{ 
    ResizeImageDialog dlg(parent, imageWidth, imageHight); 
    dlg.exec(); 



    QPair<double, double> size; 
    size.first = dlg.m_widthSpinBox->value(); 
    size.second = dlg.m_hightSpinBox->value(); 
    return size; 
} 
}; 

Et maintenant, vous pouvez le faire:

QPair<double, double> size = ResizeImageDialog::getNewSize(this, newImageFormat.width(), newImageFormat.height()); 
+0

Pourquoi n'utilisez-vous pas QSizeF comme type de retour pour votre getNewSize()? Il serait plus informatif qu'un QPair générique et il y aurait moins de dactylographie. –

+0

Ceci est juste un exemple, et pour la prochaine utilisation, vous retournerez probablement une structure de données que vous avez créée. – Narek

0

Je ne suis pas sûr de ce que pièce que vous rencontrez des problèmes avec, mais en général, vous voulez créer une classe qui hérite QInputDialog. Ajouter une méthode statique, par exemple, getPairedText(), avec la même signature que getText() sauf qu'il retourne un QPair. Puis appelez getText() de votre fonction, en passant par tous les mêmes paramètres. Lorsque getText() renvoie, analyser la chaîne dans un QPair et le renvoyer.

Si vous avez des problèmes spécifiques de mise en œuvre, demandez loin dans les commentaires ci-dessous et je vais essayer d'ajouter plus de détails à ma réponse.