2016-12-12 3 views
0

Я делаю приложение, и в какой-то момент пользователь будет создавать какой-то от/опрос. При создании пользователь выбирает различные типы вопросов и т. Д., Нажимая кнопку, и создается новый объект.Mainpulating QObject, созданный с помощью кнопки

Чтобы создать новый раздел, например:

void CreateSurvey::question_section() 
{ 
QLabel *sectionTitle = new QLabel(); 
sectionTitle->setText("New Section"); 
layout->addWidget(sectionTitle); 

QLabel *titleLabel = new QLabel("Title"); 
QLineEdit *titleEdit = new QLineEdit("New Section"); 

QHBoxLayout *hLayout = new QHBoxLayout; 
hLayout->addWidget(titleLabel); 
hLayout->addWidget(titleEdit); 

layout->addLayout(hLayout); 

sectionCount++; 
qDebug() << "sections: " << sectionCount; 
} 

Когда приложение запущено, текст «TitleEdit» будет редактироваться пользователем для названия раздела. Скажите, что это называется 3 раза, поэтому есть 3 раздела. Как получить строки, введенные для названия для каждого раздела ?, или как я могу получить строку, введенную для определенного раздела?

Благодаря

+0

Вы должны хранить объекты, которые вы заинтересованы в противном случае вы не (просто) доступ их. –

+0

Как мне это сделать? В массиве? – Phauk

+0

В макете хранятся все объекты, которые вы добавляете. Вы можете циклически перемещаться и извлекать нужные данные. – bibi

ответ

1

Вы можете использовать контейнер, как QVector для хранения QLineEdit объектов. Используйте этот контейнер для доступа к тексту каждого объекта QLineEdit.

#include <QApplication> 
#include <QtWidgets> 

class Survey : public QWidget 
{ 
    Q_OBJECT 
public: 
    Survey(QWidget *parent = Q_NULLPTR) : QWidget(parent) 
    { 
     resize(600, 400); 
     setLayout(new QVBoxLayout); 
     layout()->setAlignment(Qt::AlignTop); 
     QPushButton *button = new QPushButton("Add line edit"); 
     connect(button, &QPushButton::clicked, this, &Survey::addLineEdit); 
     layout()->addWidget(button);  
     QPushButton *print_button = new QPushButton("Print all text");  
     connect(print_button, &QPushButton::clicked, this, [=] 
     { 
      for(int i = 0; i < line_edit_vector.size(); i++) 
       qDebug() << getText(i); 
     });  
     layout()->addWidget(print_button); 
    } 

    QString getText(int index) const 
    { 
     if(line_edit_vector.size() > index) 
      return line_edit_vector[index]->text(); 
     return QString(); 
    } 

private slots: 
    void addLineEdit() 
    { 
     QLineEdit *edit = new QLineEdit("Line edit"); 
     layout()->addWidget(edit); 
     line_edit_vector.append(edit); 
    } 

private: 
    QVector<QLineEdit*> line_edit_vector; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Survey survey; 
    survey.show(); 
    return a.exec(); 
} 

#include "main.moc" 
+0

Спасибо, я пойду на это. Следующим шагом было бы сохранить его как JSON, чтобы затем можно было создать тот же опрос. Это возможно? – Phauk

+0

@Phauk Конечно. См. [Этот пример] (http://doc.qt.io/qt-5/qtcore-json-savegame-example.html). – thuga

+0

Это было действительно полезно. Я собираюсь хранить QLayouts в моем векторе. Я использую быстрый пример, чтобы попробовать хранить некоторые QLayouts, а затем распечатать их снова. 'question_vector.append (dLayout); question_vector.append (sLayout); question_vector.append (eLayout); подключить (ui-> submitButton, & QPushButton :: нажата, это, [=] { surveyLayout-> AddItem (question_vector.at (0)); }); ' Однако при нажатии submitButton, пустой добавлено пространство, а не макет (и виджеты), который я пытаюсь добавить. Что я делаю не так? – Phauk

0

в вашем CreateSurvey заголовка добавить

public slot: 
    void title_changed(); 

в методе question_section, добавить соединение:

connect(titleEdit,SIGNAL(editingFinished()),this,SLOT(title_changed())); 

и добавьте title_changed слот:

void CreateSurvey::title_changed() 
{ 
    QLineEdit *titleEdit=qobject_cast<QLineEdit*>(sender()); 
    if (titleEdit) { 
     qDebug() << titleEdit->text(); 
    } 
} 

Таким образом, каждый раз, когда линия редактируется, будет запущен слот title_changed.

, если вы хотите знать все названия раз только один было отредактированные, используйте этот слот:.

void CreateSurvey::title_changed() 
{ 
    for (int i = 0; i < layout->count(); ++i) { 
     QLineEdit *titleEdit=qobject_cast<QLineEdit*>(layout->itemAt(i)); 
     if (titleEdit) { 
      qDebug() << titleEdit->text(); 
     } 
    } 
}