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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Крах приложения QStyledItemDelegate вызыват QFileDialog::getOpenFileName  (Прочитано 3291 раз)
burevestnik
Гость
« : Апрель 25, 2013, 14:43 »

Есть такой виджет:
Код:
class MyLineFileEdit : public MyLineEdit
{
    Q_OBJECT
public:
    explicit MyLineFileEdit(QWidget *parent = 0);
    QPushButton* dialogButton;
    int widthButton; //ширина кнопки
    QString fileName;
    bool isNoFile();
signals:

public slots:
    void setOpenFileName();
protected:
    void resizeEvent ( QResizeEvent * event );
};
Создал для него делегат для QTableView.
в методе  setOpenFileName() вызываю QFileDialog::getOpenFileName.
Если в диалоге выбрать файл и нажать ок или cancel, то все нормально.
Однако, если при открытом диалоге щелкнуть мышью по ДРУГОМУ приложению то КРАХ.
Сам по себе виджет на форме, т.е. без делегата эту ситуацию отрабатывает нормально, я могу что-то делать в других приложениях, а потом вернуться в диалог и завершить начатое. Но в случае с делегатом так не получается. Что не так?
« Последнее редактирование: Апрель 25, 2013, 16:29 от burevestnik » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Апрель 25, 2013, 15:10 »

Однако, если при открытом диалоге щелкнуть мышью по ДРУГОМУ приложению то КРАХ.
В этом случае делегат теряет фокус и экземпляр MyLineFileEdit уничтожается.
Записан

Qt 5.11/4.8.7 (X11/Win)
burevestnik
Гость
« Ответ #2 : Апрель 25, 2013, 15:22 »

Т.е. в любом случае будет вызван деструктор? значит что-то нужно написать в деструкторе? не соображу.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Апрель 25, 2013, 15:58 »

Можно в перегруженном QStyledItemDelegate::eventFilter() игнорировать QEvent::FocusOut для такого случая.
Записан

Qt 5.11/4.8.7 (X11/Win)
burevestnik
Гость
« Ответ #4 : Апрель 25, 2013, 16:18 »

Цитировать
Можно в перегруженном QStyledItemDelegate::eventFilter() игнорировать QEvent::FocusOut для такого случая.

помогло) спасибо.

Код:
bool MyLineFileEditDelegate::eventFilter ( QObject * editor, QEvent * event )
{
   if(event->type() == QEvent::FocusOut)
        return false;
   return QStyledItemDelegate::eventFilter(editor,event);
}
Записан
burevestnik
Гость
« Ответ #5 : Апрель 25, 2013, 16:26 »

Цитировать
Можно в перегруженном QStyledItemDelegate::eventFilter() игнорировать QEvent::FocusOut для такого случая.

еще лучше так:

Код:
bool MyLineFileEditDelegate::eventFilter ( QObject * editor, QEvent * event )
{
    if(event->type() == QEvent::FocusOut)
    {
        MyLineFileEdit* ptr = qobject_cast<MyLineFileEdit*>(editor);
        if(ptr)
            if(ptr->isFileDialogOpen) // только когда диалог открыт. флаг выставляется перед открытием и после закрытия диалога в MyLineFileEdit
                return false;
    }
   return QStyledItemDelegate::eventFilter(editor,event);
}

« Последнее редактирование: Апрель 25, 2013, 16:28 от burevestnik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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