Russian Qt Forum
Июля 07, 2025, 23:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Получить результат от QFileDialog, когда он использован в качестве делегата .  (Прочитано 5121 раз)
Kunashir
Гость
« : Июня 01, 2011, 16:35 »

День добрый!
Собственно когда использую QFileDialog в качестве делегата, то вроде все хорошо, но при обработке завершения редактирования result () всегда возвращает ноль - не смотря какую кнопку нажали в диалоге.

Код:
CChoicePathDelegate::CChoicePathDelegate (QObject *parent)
    :QItemDelegate(parent)
{
}

QWidget *CChoicePathDelegate::createEditor(QWidget *parent,
                                          const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QFileDialog *fileDialog = new QFileDialog (parent);
    //fileDialog.setF;
    fileDialog->setAcceptMode(QFileDialog::AcceptOpen);
    fileDialog->setFilter("*.xls *.xlsx");
    return fileDialog;
}

void CChoicePathDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index).toString();
    QFileDialog *fileDialog = static_cast<QFileDialog*> (editor);
    fileDialog->selectFile (value);
}

void CChoicePathDelegate::setModelData(QWidget *editor,
                                       QAbstractItemModel *model, const QModelIndex &index) const
{
    QFileDialog *fileDialog = static_cast<QFileDialog*> (editor);
    int res = fileDialog->result();
    if (fileDialog->result() == 1) //собственно здесь условие всегда ложное, даже когда жмем "ОК" в диалоге
        model->setData(index, fileDialog->selectedFiles().at(0));
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июня 01, 2011, 17:58 »

Всё потому, что тролли не предполагали, что в качестве редактора ячейки будет использоваться диалог.
У них всё заточено на то, что редактор располагается на вью.
И, имхо, правильно делают, т.к. совершенно не очевидно, что по двойному нажатию на ячейку должен появиться диалог.
Мало того, на не линуксе диалог всегда будет ненативный и будет прятаться если вью потеряет фокус.
Для таких целей обычно делают редактор вида [______][..].

А теперь почему fileDialog->result() всегда равен 0.
Дело в том, setModelData() вызывается сразу при потере фокуса или при закрытии редактора, а установка результата в диалоге уже после того как отработает закрытие, т.е. уже после setModelData(). Если хотите оставить использовать диалог в качестве редактора, то нужно отнаследоваться от QFileDialog и перегрузить done( int r ):
Код
C++ (Qt)
void YourFSDlg::done( int r )
{
   setResult( r );
   QFileDialog::done( r );
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
Kunashir
Гость
« Ответ #2 : Июня 03, 2011, 13:22 »


Для таких целей обычно делают редактор вида [______][..].


Спасибо за совет. Сделал свой делегат с кнопочкой все теперь работает как надо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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