Не удается найти ошибку при определении делегата элемента TextEdit

Ну, ошибка, которая появляется в следующем

...\build-ChequesV2-Desktop_Qt_5_2_1_MinGW_32bit-Debug\debug\texteditdelegate.o:-1: В функции `ZN16TextEditDelegateC2EP7QObject':

ChequesV2\texteditdelegate.cpp:8: ошибка: недопустимая ссылка на файл: 1: ошибка: ошибка: ld вернул 1 состояние выхода

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

вот заголовок:

#ifndef TEXTEDITDELEGATE_H
#define TEXTEDITDELEGATE_H

#include <QStyledItemDelegate>

class TextEditDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    TextEditDelegate(QObject *parent = 0);

    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const;

    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const;

};

#endif // TEXTEDITDELEGATE_H

И реализация:

#include "texteditdelegate.h"

#include <QStyledItemDelegate>
#include <QInputDialog>



TextEditDelegate::TextEditDelegate(QObject *parent): QStyledItemDelegate(parent)
{

}

QWidget *TextEditDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QInputDialog *editor = new QInputDialog(parent);
    editor->setOption(QInputDialog::UsePlainTextEditForTextInput);
    editor->setInputMode(QInputDialog::TextInput);
    editor->setLabelText("Ingrese el concepto del cheque");

    return editor;
}


void TextEditDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();

    QInputDialog *inputDialog = static_cast<QInputDialog*>(editor);
    inputDialog->setTextValue(value);
}


void TextEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QInputDialog *inputDialog = static_cast<QInputDialog*>(editor);
    if (!inputDialog) return;

    model->setData(index, inputDialog->textValue()/*, Qt::EditRole*/);
}

и вот звонок:

view = new QTableView;
view->setModel(tableProxy);
view->setItemDelegateForColumn(COLUMNADECONCEPTO, new TextEditDelegate(view));

Хотя комментирование последней строки ничего не меняет, ошибка все равно отображается.

1 ответ

Решение

Вы, кажется, static_cast'ing QWidget указатель. Это не очень хорошая идея.

QInputDialog *inputDialog = static_cast<QInputDialog*>(editor);

Короче говоря, static_cast предназначен для использования в ситуациях, когда вы знаете, что во время компиляции безопасно преобразовывать данные из одного типа в другой.

Однако в этом случае это решение во время выполнения, которое не может быть оценено так, как вы ожидаете во время компиляции. В таких случаях вам нужно использовать dynamic_cast с C++, но в мире Qt qobject_cast даже лучше при работе с QObjects.

Плюс TextEditDelegate(QObject *parent = 0); Должно измениться на это: TextEditDelegate(QWidget *parent = 0);

Это, вероятно, красная сельдь и ложный вывод. Он также должен работать с QObject.

Другие вопросы по тегам