如何将lineEdits分配给某个变量?

时间:2015-01-03 07:41:11

标签: c++ arrays qt qlineedit

我是Qt的新手。我被困在这件事上了。我的应用程序中有很多lineEdits,其中的值可能会在应用程序运行时随时更改。 lineEdits中的值只是整数。在某些阶段,我需要检查lineEdits中的值并与整数数组进行比较。如果它们相等,那么用户的任务就完成了。

这里我想将lineEdits的所有值存储到整数数组中,以便我可以运行for循环来检查两个数组是否相等,而不是为每个数组创建if条件lineEdit。每当用户更改lineEdit中的值时,数组中的值都应更新,并且当数组中的相应值更改时,lineEdit中的值也应更改。

我尝试了一个qvector,将lineEdits的值附加到其中。此向量现在具有lineEdits值,但在向量中更改其对应值时不会更新值。

有人可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我建议使用QDataWidgetMapper,因为它会使用模型/视图设计模式,它有几个优点。下面的示例清楚地表明所有QLineEdit中的数据都可以轻松汇总。该示例包含两个文件main.cpp和mainwin.h:

<强> mainwin.h:

#ifndef MAINWIN_H
#define MAINWIN_H
#include <QtGui>
static const int lineEditCount=4;
class MainWin : public QMainWindow
{
      Q_OBJECT
      QStandardItemModel& model;
   public:
      explicit MainWin(QStandardItemModel& m)
      : model(m)
      {
         setWindowTitle("QDataWidgetMapper Example");
         resize(400,400);
         QDataWidgetMapper* mapper=new QDataWidgetMapper(this);
         mapper->setModel(&m);
         QWidget *w = new QWidget;
         QVBoxLayout *layout = new QVBoxLayout;
         w->setLayout(layout);
        for(int i=0;i<lineEditCount;++i)
        {
           QLineEdit* e=new QLineEdit;
           layout->addWidget(e);
           mapper->addMapping(e,i);
        }
        layout->addWidget(new QTextEdit);
        setCentralWidget(w);
        mapper->setCurrentIndex(0); // the only existing row is activated
        reactToChange(0);
        connect(&m,SIGNAL(itemChanged(QStandardItem*)), 
                 this,SLOT(reactToChange(QStandardItem*)));
      }
   private slots:
      void reactToChange(QStandardItem*)
      {
         QTextEdit* t=findChild<QTextEdit*>();
         t->append("=========================");
         for(int i=0;i<lineEditCount;++i)
            t->append(model.item(0,i)->text());
      }
};
#endif

<强> main.cpp中:

#include <QtGui>
#include "mainwin.h"
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    /* Create the data model. It has only one row, but as many columns as there are
       QLineEdit. */
    QStandardItemModel model(1,lineEditCount);
    for(int column = 0; column < 4; ++column)
    {
      QStandardItem *item = new QStandardItem(QString("QLineEdit %0 value").arg(column));
      model.setItem(0,column, item);
    }
    MainWin mainWin(model);
    mainWin.show();
    return app.exec();
}

每当QLineEdit中的任何一个更改时,系统会显示所有QLineEdit中值的新摘要,请参阅下文。

enter image description here

答案 1 :(得分:0)

Qt完全是关于信号和插槽的。在您的情况下,您需要将lineEdit的文本编辑信号连接到您要修改的变量。在具有lineEdit的对话框中,您应该在构造函数中具有连接,例如:

connect(ui->lineEdit, &QLineEdit::textEdited, this, &YourDialog::textEdited);

这会将lineEdit的{​​{1}}信号连接到textEdited的插槽,我也为此示例命名为YourDialog

此广告位应采用textEdited的单个参数,因为根据Qt的文档,const QString&正在发出的是

然后,您可以在此插槽函数中执行任何操作,例如将输入转换为QLineEdit::textEdited int并将其值分配给数组元素等。

此外,如果您确定唯一的条目应该lineEdit->text().toInt()到此int,则在构造函数中,您可以使用lineEdit对象QIntValidator来确保用户将lineEdit->setValidator值编辑为您指定范围内的有效整数。

答案 2 :(得分:0)

您可以将QLineEdit的指针列表作为类成员:

QList<QLineEdit *> lineEdits;

在实例化时将指针添加到列表中:

QLineEdit * lineEdit = new QLineEdit(this);
lineEdits->append(lineEdit);

然后QSignalMapper在更新行编辑时更新值数组非常有用。 QSignalMapper类收集一组无参数信号,并使用与发送信号的对象相对应的整数,字符串或窗口小部件参数重新发出它们。所以你可以有一个像:

QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(OntextChanged(int)));

对于每个线路编辑,您可以将textChanged()信号连接到map()的{​​{1}}位置,并使用QSignalMapper添加映射,以便在{{1}时从行编辑中发出信号,发出信号setMapping

textChanged()

这样,无论何时更改行编辑,都会发出映射器的mapped(int)信号,其中包含行编辑的索引作为参数。

可以在for(int i=0; i<lineEdits.count(); i++) { QObject::connect(lineEdits[i], SIGNAL(textChanged()),mapper,SLOT(map())); mapper->setMapping(lineEdits[i], i+1); } 插槽中更新数组的值,如:

mapped(int)