【问题标题】:How can I assign lineEdits to some variable?如何将 lineEdits 分配给某个变量?
【发布时间】:2015-01-03 07:41:10
【问题描述】:

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

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

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

任何人都可以帮助如何做到这一点?

【问题讨论】:

    标签: c++ arrays qt qlineedit


    【解决方案1】:

    我会推荐使用 QDataWidgetMapper,因为它会使用具有多个优点的模型/视图设计模式。下面是一个例子,清楚地表明所有 QLineEdit 中的数据都可以很容易地汇总。该示例包含两个文件 main.cpp 和 mainwin.h:

    ma​​inwin.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
    

    ma​​in.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 中值的新摘要,请参见下文。

    【讨论】:

      【解决方案2】:

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

      QList<QLineEdit *> lineEdits;
      

      并在实例化它们时将指向 linedits 的指针添加到列表中:

      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() 信号连接到QSignalMappermap() 插槽,并使用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) 信号,其中包含行编辑的索引作为参数。

      数组的值可以在OntextChanged 槽中更新,例如:

      void MyClass::OntextChanged(int index)
      {
         values[index-1] = lineEdits[index-1].text().toInt();
      }
      

      【讨论】:

        【解决方案3】:

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

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

        这会将lineEdittextEdited 信号连接到YourDialog 的插槽,在此示例中我也将其命名为textEdited

        此插槽应采用 const QString&amp; 的单个参数,因为根据 Qt 的文档,这是 QLineEdit::textEdited 发出的内容。

        然后,你可以在这个槽函数中做任何你喜欢的事情,比如将输入转换为intlineEdit-&gt;text().toInt() 并将其值分配给数组元素等。

        此外,如果您确定此lineEdit 的唯一条目应该是ints,则在构造函数中,您可以使用QIntValidator 对象和lineEdit-&gt;setValidator 以确保用户编辑@987654336 @value 为您指定范围内的有效整数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          • 1970-01-01
          • 2014-01-15
          • 1970-01-01
          • 2014-03-04
          相关资源
          最近更新 更多