如何在组合框委托中获取第一项作为默认项?

时间:2016-01-29 08:38:17

标签: c++ qt

我正在使用继承QStyledItemDelegate的QAbstractTableModel和ComboBoxItemDelegate。我能够在表格视图中的组合框中填充我的数据,但默认情况下不会显示任何内容,但在下拉列表中可以看到正确的数据。如何将第一项设置为默认项并显示它?

我的Combox委托:

class ComboBoxItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    ComboBoxItemDelegate(QObject* parent = 0);
    ~ComboBoxItemDelegate();

    virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;
    virtual void setEditorData(QWidget* editor, const QModelIndex& index) const;
    virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;
    virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};

创建编辑器功能:

QWidget* ComboBoxItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
        QComboBox* cb = new QComboBox(parent);
        QStringList destList = SFilterEditorData::instance().getDestinationList();
        cb->addItem(QString("All"));
        for (int i = 0; i < destList.size(); i++)
        {
            cb->addItem(destList.at(i));
        }
        cb->setEditable(true);
        return cb;
}

设置编辑功能:

void ComboBoxItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
    if (QComboBox* cb = qobject_cast<QComboBox*>(editor)) {
        //QString currentText = index.data(Qt::EditRole).toString();
        QString currentText = index.model()->data(index, Qt::DisplayRole).toString();
        int cbIndex = cb->findText(currentText);
        // if it is valid, adjust the combobox
        if (cbIndex >= 0)
            cb->setCurrentIndex(cbIndex);
    }
    else {
        QStyledItemDelegate::setEditorData(editor, index);
    }
}

在我的模型中插入行:

bool STableModel::insertRows(int position, int rows, const QModelIndex &parent)
{
    int columns = columnCount();
    beginInsertRows(parent, position, position + rows - 1);

    for (int row = 0; row < rows; ++row) {
        QStringList items;
        for (int column = 0; column < columns; ++column)
        {
            items.append(""); // This might be the reason for this issue.
        }
        rowList.insert(position, items);
    }
    endInsertRows();
    return true;
}

在模型中设置数据:

QVariant STableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::DisplayRole)
        return rowList[index.row()][index.column()];
    else if (role == Qt::CheckStateRole && index.column() == 0)
    {

        int status = SFilterEditorData::instance().getStatus(index.row());
        if (status)
            return Qt::Checked;
        else
            return Qt::Unchecked;
    }
    else
        return QVariant();
}

bool STableModel::setData(const QModelIndex &index,
                         const QVariant &value, int role)
{
    if (!index.isValid() /*|| role != Qt::EditRole*/)
        return false;
    if (role == Qt::CheckStateRole)
    {
        if ((Qt::CheckState)value.toInt() == Qt::Checked)
        {
            SFilterEditorData::instance().setStatus(index.row(),1);
            return true;
        }
        else
        {
            SFilterEditorData::instance().setStatus(index.row(), 0);
            return true;
        }
    }

我已经提到过这个链接:http://www.qtcentre.org/threads/39194-setEditorData()-for-QComboBox-Delegate

0 个答案:

没有答案