crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Делегат QComboBox в модели QTableView
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 11.12.2018, 13:28
 
Цитата(Алексей1153 @ 24.11.2018, 10:15) *
наверное, ничего не надо там возвращать, если делегат есть.
возвращать всё же стоит. Для EditRole при наличии своего делегата можно возвращать тоже что и для DisplayRole (т.е. для обычного отображения).


Цитата(Jafferson @ 23.11.2018, 10:19) *
Слот, который создает новую заметку в таблице.
Проблемы: каждый раз когда будет вызван слот будет создан новый делегат, помещён в представление. А старый так и останется занимать память.
Правильный способ: создал представление, создал ему делегаты. Делегаты должны сами получать связанные с их работой данные.
Алексей1153 Дата 24.11.2018, 8:15
  наверное, ничего не надо там возвращать, если делегат есть. Виджет же сам себя отображает. Либо нужно вызвать data родительского класса (попробовать сейчас не на чем)

Cовет: нумеровать колонки не цифрами, а именованными константами
например

enum class mycolumns:int
{
   discipname=0,
   discipcourse,
   somedata,
};

...

switch (mycolumns(index.column()))
{
            case mycolumns::discipname:
                return mMainTable[index.row()].discipname();

            case mycolumns::discipcourse:
                return mMainTable[index.row()].discipcourse();

            case mycolumns::somedata:
                return QVariant();
  }
Jafferson Дата 23.11.2018, 8:19
  Добрый день товарищи. Появилась проблема которую не могу решить уже очень долгое время. В общем, у меня есть модель QTableView в которой я хочу в определенном столбце выводить делегат QComboBox. Проблема в том, что не понимаю что нужно возвращать в методе data в столбце где должен быть делегат. Подскажите, что я делаю не так. P.S. Это мой первый большой проект на Qt, так что принимаю любую критику.

Описание делегата.
void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);
}

QWidget *MyDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{    
    if (index.column() == 2)
    {
        QComboBox *comboBox = new QComboBox(parent);
        comboBox->addItems(m_list);
        return comboBox;
    }
    else
    {
        return QStyledItemDelegate::createEditor(parent, option, index);
    }

}

void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if (index.column() == 2)
    {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        int pos = comboBox->findText(index.model()->data(index, Qt::EditRole).toString(), Qt::MatchExactly);
        comboBox->setCurrentIndex(pos);
    }
    else
    {
        return QStyledItemDelegate::setEditorData(editor, index);
    }
}

void MyDelegate::setModelData( QWidget * editor, QAbstractItemModel *model, const QModelIndex& index) const
{
    if (index.column() == 2)
    {
        QComboBox *comboBox = static_cast<QComboBox*>(editor);
        QString data = comboBox->currentText();
        model->setData(index, data);
    }
    else
    {
        return QStyledItemDelegate::setModelData(editor, model, index);
    }
}

void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const
{
    editor->setGeometry(option.rect);
}


Слот, который создает новую заметку в таблице.
bool MainWindow::addDiscip()
{
    if (!isTableOpen())
    {
        QMessageBox::warning(this, "Внимание", tr("Таблица не открыта!"));
        return false;
    }

    AddDiscipDialog discipDlg(this);
    discipDlg.setWindowTitle("Дисциплины");
    MyDelegate *delegate = new MyDelegate(this);
    Note note;  // объект который содержит в себе информацию: название, номер семестра, номер курса дисциплины
    discipDlg.setNote(&note);
    discipDlg.setDelegate(delegate);
    if (discipDlg.exec() != AddDiscipDialog::Accepted)
    {
        return false;
    }

    maintable->insert(note);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    ui->tableView->setItemDelegateForColumn(2, delegate);
    return true;
}


Метод data моей модели.
QVariant MainTable::data(const QModelIndex &index, int role) const
{
    if (role == Qt::DisplayRole)
            switch (index.column())
            {
            case 0:
                return mMainTable[index.row()].discipname();
            case 1:
                return mMainTable[index.row()].discipcourse();
            case 2:
                return ???
            }

    return QVariant();
}
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 13:30