在QT中,利用QIuputDialog可以轻易地输入一段字符串,但这个方法有两个缺点:
1:不能直接输入多段字符
2:不能在accept或reject的时候作一些额外的处理,
1:不能直接输入多段字符
2:不能在accept或reject的时候作一些额外的处理,
我自定义了MultiInputDialog类,可以很好的解决这个问题。
思路:该程序很简单,就多作解释了
截图:
上代码:
#include <QtGui>
class MultiInputDialog : public QDialog
{
Q_OBJECT
private:
const int m_GroupCount;
QLabel **m_Labels;
QLineEdit **m_LineEdits;
QPushButton *m_OKButton;
QPushButton *m_CancelButton;
public:
MultiInputDialog(int count, QWidget *parent = 0);
virtual ~MultiInputDialog();
void SetLabelTexts(const QStringList &listText);
void SetOneLabelText(int index, const QString &text);
QString GetOneText(int index);
QStringList GetAllTexts();
//为了让多组输入框看起来整齐些,所以我固定了QLabel的宽度
void SetLabelsWidth(int width);
//使用正则表达式来限制输入的字符
void SetLineEditRegExp(int index, QRegExp regExp);
//请根据需要重写这两个函数
virtual void accept() { QDialog::accept(); }
virtual void reject() { QDialog::reject(); }
};
MultiInputDialog::MultiInputDialog(int count, QWidget *parent)
: QDialog(parent), m_GroupCount(count)
{
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *subLayout;
m_Labels = new QLabel*[m_GroupCount];
m_LineEdits = new QLineEdit*[m_GroupCount];
//设计界面
for(int i=0; i<m_GroupCount; i++)
{
subLayout = new QHBoxLayout;
m_LineEdits[i] = new QLineEdit(this);
m_Labels[i] = new QLabel(this);
subLayout->addWidget(m_Labels[i]);
subLayout->addWidget(m_LineEdits[i]);
layout->addLayout(subLayout);
}
m_OKButton = new QPushButton( tr("OK"), this );
m_CancelButton = new QPushButton( tr("Cancel"), this );
subLayout = new QHBoxLayout;
subLayout->addStretch();
subLayout->addWidget(m_OKButton);
subLayout->addWidget(m_CancelButton);
layout->addLayout(subLayout);
setLayout(layout);
connect(m_OKButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(m_CancelButton, SIGNAL(clicked()), this, SLOT(reject()));
}
MultiInputDialog::~MultiInputDialog()
{
delete m_LineEdits;
delete m_Labels;
}
void MultiInputDialog::SetLabelTexts(const QStringList &listText)
{
for(int i=0; i<listText.size(); i++)
{
if( i >= m_GroupCount )
break;
m_Labels[i]->setText( listText.at(i) );
}
}
void MultiInputDialog::SetOneLabelText(int index, const QString &text)
{
m_Labels[index]->setText(text);
}
void MultiInputDialog::SetLabelsWidth(int width)
{
for(int i=0; i<m_GroupCount; i++)
m_Labels[i]->setFixedWidth(width);
}
void MultiInputDialog::SetLineEditRegExp(int index, QRegExp regExp)
{
QValidator *validator = new QRegExpValidator(regExp, this);
m_LineEdits[index]->setValidator( validator );
}
QString MultiInputDialog::GetOneText(int index)
{
return m_LineEdits[index]->text();
}
QStringList MultiInputDialog::GetAllTexts()
{
QStringList list;
for(int i=0; i<m_GroupCount; i++)
{
list.push_back( m_LineEdits[i]->text() );
}
return list;
}
#include "main.moc"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MultiInputDialog dialog(5);
QStringList list;
list << "One: " << "Two: " << "Three: " << "Four: " << "Five: ";
dialog.SetLabelTexts(list);
dialog.SetLabelsWidth(30);
dialog.show();
return app.exec();
}