Russian Qt Forum
Ноябрь 01, 2024, 09:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [4.x.x] Проблема с использованием делегата.  (Прочитано 3060 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« : Апрель 02, 2009, 22:46 »

Всем доброго.
Обрисую сначала общую ситуацию. Есть моя модель, есть класс, отнаследованный от QWidget, на котором лежит QTreeView с установленной моделью. Нужно иметь возможность редактировать первый столбец модели (там текстовый данные). Умолчательный делегат не подходит по нескольким параметрам:
1. Почему-то он черезчур узкий в высоту, т.е. знак _ становится невидно.
2. Мне нужно, чтобы выделялся не весь текст, а определенная его часть.
Решил заморочить свой делегат. Вот его код:
Объявление
Код
C++ (Qt)
class RenameDelegate: public QItemDelegate
{
Q_OBJECT
private:
/*Нужно для того, чтобы потом можно было делать свое выделение в эдиторе.
При закрытии эдитора мы его зануляем. Это хак, но пока работает. :)*/

mutable QLineEdit* qleEditor;
public:
RenameDelegate(QObject * parent = 0)
:QItemDelegate(parent)
{
qleEditor=0;
connect(this,
SIGNAL(closeEditor(QWidget*)),
this,
SLOT(nullEdit()));
}
QWidget * createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
void setEditorData ( QWidget * editor, const QModelIndex & index ) const;
QLineEdit* editor();
private slots:
void slotCommitAndClose();
void nullEdit() {qleEditor=0;}
};
//
 
Реализация
Код
C++ (Qt)
QWidget * RenameDelegate::createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
QLineEdit* qleEdit=new QLineEdit(parent);
 
qleEditor=qleEdit;
connect(qleEdit,
SIGNAL(returnPressed()),
this,
SLOT(slotCommitAndClose()));
return qleEdit;
}
void RenameDelegate::slotCommitAndClose()
{
QLineEdit* qleEdit=qobject_cast<QLineEdit*>(sender());
emit commitData(qleEdit);
emit closeEditor(qleEdit);
}
//
void RenameDelegate::setEditorData ( QWidget * editor, const QModelIndex & index ) const
{
QLineEdit* qleEdit=qobject_cast<QLineEdit*>(editor);
qleEdit->setText(index.model()->data(index,Qt::EditRole).toString());
qleEdit->deselect(); //Ничего не делает
}
//
QLineEdit* RenameDelegate::editor()
{
return qleEditor;
}
 
Использование:
Код
C++ (Qt)
................
qdRenameDelegate=new RenameDelegate();
qtrvView->setItemDelegateForColumn(0,qdRenameDelegate);
................
connect(qtrvView->itemDelegateForColumn(0),
SIGNAL(closeEditor(QWidget*)),
this,
SLOT(slotRenameFile(QWidget*)));
..................
void QFileListView::slotRenameFile(QWidget * editor)
{
QLineEdit* qleEdit=qobject_cast<QLineEdit*>(editor);
if (!qleEdit)
return;
if (QFile::rename(currentFileName(),qleEdit->text()))
{
flmModel->slotRefresh();
}
else
QMessageBox::critical(this,
tr("Error rename"),
tr("Error rename file %1 to %2.").arg(currentFileName()).arg(qleEdit->text()));
}
......................
void QFileListView::slotRename()
{
QLineEdit* edit=qdRenameDelegate->editor();
if (edit)
{
QString qsFileName=edit->text();
int index=qsFileName.lastIndexOf(".");
if (edit->selectedText()==qsFileName.left(index) || edit->selectedText().isEmpty())
edit->selectAll();
else
edit->setSelection(0,index);
return;
}
qtrvView->edit(qtrvView->currentIndex());
edit=qdRenameDelegate->editor();
if (edit)
{
edit->resize(qtrvView->header()->sectionSize(0)+
qtrvView->header()->sectionSize(1)-
qtrvView->iconSize().width(),
edit->fontMetrics().height()+6);
if (selectOnlyFileName)
{
QString qsFileName=edit->text();
int index=qsFileName.lastIndexOf(".");
if (index>0)
edit->setSelection(0,index);
else
edit->selectAll();
}
else
edit->selectAll();
}
}
//
 
Недостатки:
1. При завершении ввода в делегате (т.е. нажатии энтера), у вьюхи срабатывает сигнал activated(const QModelIndex&).
2. Под Линем выполз вот такой казус (см.рис.).
Сейчас уже мозги не варят, так что извините, если что напутал.
« Последнее редактирование: Апрель 02, 2009, 22:48 от panter_dsd » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Апрель 03, 2009, 12:40 »

Нафиг выкинул телегада и создаю при надобности QLineEdit поверх вьювера.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.134 секунд. Запросов: 23.