Не удается найти ошибку при определении делегата элемента 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.