2015-01-03 3 views
2

Qt로 작업하는 것이 처음입니다. 그리고 나는이 일에 매달렸다. 내 응용 프로그램에 lineEdits가 많이 있습니다. 응용 프로그램이 실행되는 동안 언제든지 값이 변경 될 수 있습니다. lineEdits의 값은 정수입니다. 어떤 단계에서 lineEdits의 값을 확인하고 정수 배열과 비교해야합니다. 동일하면 사용자 작업이 완료됩니다.lineEdits를 일부 변수에 어떻게 할당합니까?

여기에 내가 두 배열 대신 각각의 모든 lineEdit에 대한 if 조건을 만드는 동일한 경우 확인하기 위해 for 루프를 실행할 수 있도록 정수 배열에 lineEdits의 모든 값을 저장할. 배열의 값은 사용자가 lineEdit의 값을 변경할 때마다 업데이트되어야하며, 배열의 해당 값이 변경되면 lineEdit의 값도 변경되어야합니다.

qvector를 사용하여 lineedit 값을 추가하려고했습니다. 이 벡터는 이제 lineEdits 값을 가지지 만 해당 값이 벡터에서 변경되면 값을 업데이트하지 않습니다.

아무도 도와 줄 수 있습니까?

답변

0

:을 인스턴스화 할 때

QList<QLineEdit *> lineEdits; 

그리고 목록에 linedits 포인터를 추가 :

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

그런 다음 QSignalMapper 유용 행 편집이 갱신 될 때 값의 배열을 갱신합니다. QSignalMapper 클래스는 매개 변수없는 신호 집합을 수집하고 신호를 보낸 객체에 해당하는 정수, 문자열 또는 위젯 매개 변수를 사용하여 매개 변수없는 신호 집합을 다시 방출합니다.textChanged()이 라인 편집에서 신호를 때 있도록 당신이 QSignalMappermap() 슬롯에 textChanged() 신호를 연결하고 setMapping를 사용하여 매핑을 추가 수정 작업하여 라인의 각각에 대해

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

: 그래서 당신은 같은 일을 할 수 있습니다 신호 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) 신호는 매개 변수로 편집 행의 인덱스를 포함하는 방출된다. 그것은 몇 가지 장점이 있습니다 모델/뷰 디자인 패턴을 사용하기 때문에

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

Qt는 모두 신호와 슬롯에 관한 것입니다. 귀하의 경우에는 lineEdit의 텍스트 편집 신호를 수정할 변수에 연결해야합니다. 이것은 내가이 예를 들어 textEdited에 지명의 슬롯 'YourDialog로의 textEdited 신호'를 lineEdit를 연결합니다

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

: 당신이 lineEdit이 대화 상자에서는 다음과 같은 생성자에서 연결을해야한다 .

이 슬롯은 const QString&이라는 단일 인수를 취해야합니다. 그 이유는 Qt의 설명서에 따라 QLineEdit::textEdited이 방출하기 때문입니다.

그런 다음 예는 확인 경우

또한 등, 배열 요소 값을 lineEdit->text().toInt() 함께 int에 입력 변환 및 할당으로서,이 슬롯 함수 내에서 원하는대로 할 수있다 이 lineEditint을 입력하고 생성자에서 lineEdit->setValidator과 함께 QIntValidator 개체를 사용하여 lineEdit 값을 사용자가 지정한 범위 내에서 유효한 정수로 편집하는지 확인할 수 있습니다.

당신은 클래스 멤버로 QLineEdit들에 대한 포인터의 목록을 가질 수
2

내가 QDataWidgetMapper를 사용하는 것이 좋습니다 : 배열의

값은 OntextChanged 슬롯 등을 업데이트 할 수있다. 다음은 모든 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

관련 문제