2015-01-06 7 views
0

У меня есть QComboBox в одном из столбцов QTableView. Как изменить другие столбцы в зависимости от того, что я выбрал в ComboBox? Я использую QComboBox в качестве делегата.Изменение данных в QTableView в зависимости от выбора QComboBox

+0

Чтобы создать более информативный ответ, пожалуйста, какую модель вы используете? QStandardItemModel или ваша собственная пользовательская модель? – Chernobyl

+0

@ Чернобыль: QStandardItemModel. – gartenriese

+0

Я уже воспроизвел ваш код (делегат с combobox), и мое решение работает, если я выберу что-то в combobox и подтвержу это, нажав, например, нажав кнопку. Но если вы хотите получить решение, в котором данные будут автоматически изменены, когда вы выберете другой элемент в combobox (не нажимая enter), тогда скажите мне, пожалуйста, я отредактирую свой ответ. – Chernobyl

ответ

2

Существует по крайней мере 2 подхода.

  • Использование натурального для модели Qt itemChanged сигнал.
  • Извлеките сигнал от своего делегата и поймайте его в своем главном окне.

Если делегат стандарт, который означает, что внутри setModelData() метода у вас есть что-то вроде:

QComboBox *line = static_cast<QComboBox*>(editor); 
QString data = line->currentText(); 
//... 
model->setData(index, data); 

, то я думаю, вы должны использовать только естественный путь. Например:

connect(model,&QStandardItemModel::itemChanged,[=](QStandardItem * item) { 
    if(item->column() == NEEDED_COLUMN) 
    { 
     //you found, just get data and use it as you want 
     qDebug() << item->text(); 
    } 
}); 

Я здесь C++11 (CONFIG += c++11 в .pro файл) и new syntax of signals and slots, но, конечно, вы можете использовать старый синтаксис, если вы хотите.

Я уже воспроизвел ваш код (делегат с combobox), и мое решение работает, если я выберу что-то в combobox и подтвержу это, нажав, например, нажав кнопку. Но если вы хотите получить решение, в котором данные будут изменены автоматически, когда вы выбираете другой пункт в выпадающем списке (без нажатия клавиши ввода), то смотрите следующий случай:

Создать специальный играющий сигнал делегата:

signals: 
    void boxDataChanged(const QString & str); 

Создать соединение внутри createEditor() метод:

QWidget *ItemDelegate::createEditor(QWidget *parent, 
            const QStyleOptionViewItem &option, 
            const QModelIndex &index) const 
{ 
    QComboBox *editor = new QComboBox(parent); 
    connect(editor,SIGNAL(currentIndexChanged(QString)),this,SIGNAL(boxDataChanged(QString))); 
    return editor; 
} 

И используйте его!

ItemDelegate *del = new ItemDelegate; 
ui->tableView->setItemDelegate(del); 
ui->tableView->setModel(model); 
    connect(del,&ItemDelegate::boxDataChanged,[=](const QString & str) { 
      //you found, just get data and use it as you want 
      qDebug() << str; 
    }); 
+0

Отличный ответ! Ваше первое предложение отлично поработало для меня, спасибо большое! – gartenriese

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