2010-09-16 75 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] 

该函数被定义为调用对话框get和返回将被插入到QLine编辑中的文本。所以我想创建一个返回数据结构(比如说QPair)的getData静态方法,并且像QInputDialog::getText()一样工作。我尝试过,但我无法做到这一点。我怎样才能做到这一点?如何将静态方法添加到QInputDialog以返回自定义数据?

+0

你要买修改QInputDialog类本身? – jrharshath 2010-09-16 12:18:42

+0

你能更具体地说明你正在尝试做什么吗?你想输入两个你想存储在QPair中的字符串吗? – 2010-09-16 12:25:14

+0

是的,我想输入两个字符串,我想存储在QPair中。 – Narek 2010-09-16 12:35:50

回答

1

我已经做到了,但是我发布了需要此功能的人。这是一个对话框的示例,用于调整图像的大小。更准确地说,它代表用户当前的图像大小,并为他/她提供一个界面来改变尺寸并用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; 
} 
}; 

现在你可以这样做:

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

为什么不使用QSizeF作为getNewSize()的返回类型?它会比通用的QPair 更具信息性,并且会减少输入。 – 2010-09-18 21:26:59

+0

这只是一个例子,下次使用时您可能会返回您创建的数据结构。 – Narek 2010-09-21 07:39:45

0

我不确定你有什么问题,但一般情况下,你想创建一个继承QInputDialog的类。添加一个静态方法,如getPairedText(),其签名与getText()相同,但返回QPair。然后从你的函数调用getText(),传递所有相同的参数。当getText()返回时,将该字符串解析为QPair并将其返回。

如果您在实施时遇到任何具体问题,请在下面的评论中提问,我会尝试在答案中添加更多详细信息。

相关问题