2015-05-02 4 views
0

Так что в моей программе я динамически генерирую QCheckBox, число зависит от результата запроса и рядом с каждым QCheckBox Я хочу иметь QLineEdit, который бы отображается только тогда, когда QCheckBox проверен , так как я могу связать его.qt создает динамический объект и назначает другую функцию одному и тому же сигналу

До сих пор я только что-то вроде этого, и я не знаю, как сделать это, не имея вектор указателей все созданных динамически (например, что vector<vector<QObject*> > objets;):

sondage_page2::sondage_page2(QWidget *parent) : 
QWidget(parent), 
ui(new Ui::sondage_page2) 
{ 
    // ... 
    if(query.exec()) 
    { 
     if(query.size()>0) 
     { 
      while(query.next()) 
      { 
       QCheckBox* check=new QCheckBox(query.value("Marque").toString()); 
       ui->gridLayout->addWidget(check,row,0,Qt::AlignHCenter); 

       vector<QObject*> temp; 
       temp.push_back(check); 
       objets.push_back(temp); 

       QObject::connect(check,SIGNAL(stateChanged(int)),this,SLOT(checked(int))); 
      } 
      // ... 
     } 
    } 
} 

void sondage_page2::checked(int state) 
{ 
    // très broken 
    if(state==2) // checked 
    { 
     QLineEdit* edit=new QLineEdit(); 
     objets.at(objets.size()-1).push_back(edit); 
     ui->gridLayout->addWidget(edit,row-1,1,Qt::AlignHCenter); 
    } 
    else 
    { 
     delete objets.at(row-1).at(1); 
     objets.at(row-1).pop_back(); 
    } 
} 

EDIT: В принципе, я хочу, чтобы QLineEdit отображался (или создавался) в той же строке, что и мой QCheckBox, когда создается QCheckBox, а с помощью функции QObject :: connect я могу только связывать объекты с одной и той же функцией, как я могу это работает?

+0

Спасибо, что сообщили нам. Эмм ... в чем вопрос? – Greenflow

+0

Прошу прощения, если это не совсем кристально чистое, я хочу, чтобы «QLineEdit» отображался (или создавался) в той же строке, что и «QCheckBox» при создании 'QCheckBox', и с помощью Функция 'QObject :: connect'. Я могу привязать объекты только к одной и той же функции, как я могу это работать? –

+0

Btw .. вы должны изменить свое название ... различные функции для одного и того же события. Сигнал, а не событие. Событие имеет в Qt четко определенное и совершенно другое значение. – Greenflow

ответ

1

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

Вы можете использовать

< QMap QCheckBox *, QLineEdit *>

связать ваш QCheckBox с QLineEdit.

В sondage_page2 :: sondage_page2:

QCheckBox* check=new QCheckBox(query.value("Marque").toString()); 
...add to grid... 
map[check] = nullptr; 
connect(.....) 

В sondage_page2 :: Проверила:

QCheckBox *check = qobject_cast<QCheckBox *>(sender()); 
if(check){ 
    if(state == 2){ 
    QLineEdit* edit=new QLineEdit(); 
    map[check] = edit; 
    ...enter edit in gridlayout... 
    }else{ 
    ...remove from layout.... 
    map[check].take()->deleteLater() // delete the QLineEdit; 
    edit->deleteLater(); 
    } 
}else{ 
    // should not be possible... I think 
} 

Эти фрагменты должны точно сделать то, что код, который вы указано выше намеревается сделать ... насколько Я понял. Не все возможные необходимые проверки работоспособности, например. действительно ли на карте?

+0

Итак, ваш код работает, и QMap действительно полезен, но я хочу, чтобы, если выбрано 2 QCheckBox, тогда будет отображаться 2 QLineEdit Но я не знаю, как получить текущий QCheckBox, нажатый в моей проверенной функции, чтобы показать связанный с QLineEdit –

+1

Erm ... вы видели мое использование функции отправителя() в проверочном слоте? – Greenflow

+0

Да, извините, это работает –

Смежные вопросы