QT:多行输入框的实现

在QT中,利用QIuputDialog可以轻易地输入一段字符串,但这个方法有两个缺点:
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();
}


  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值