Russian Qt Forum

Qt => Model-View (MV) => Тема начата: burevestnik от Апрель 25, 2013, 14:43



Название: [РЕШЕНО]Крах приложения QStyledItemDelegate вызыват QFileDialog::getOpenFileName
Отправлено: 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, то все нормально.
Однако, если при открытом диалоге щелкнуть мышью по ДРУГОМУ приложению то КРАХ.
Сам по себе виджет на форме, т.е. без делегата эту ситуацию отрабатывает нормально, я могу что-то делать в других приложениях, а потом вернуться в диалог и завершить начатое. Но в случае с делегатом так не получается. Что не так?


Название: Re: Крах приложения QStyledItemDelegate вызывает QFileDialog::getOpenFileName
Отправлено: GreatSnake от Апрель 25, 2013, 15:10
Однако, если при открытом диалоге щелкнуть мышью по ДРУГОМУ приложению то КРАХ.
В этом случае делегат теряет фокус и экземпляр MyLineFileEdit уничтожается.


Название: Re: Крах приложения QStyledItemDelegate вызывает QFileDialog::getOpenFileName
Отправлено: burevestnik от Апрель 25, 2013, 15:22
Т.е. в любом случае будет вызван деструктор? значит что-то нужно написать в деструкторе? не соображу.


Название: Re: Крах приложения QStyledItemDelegate вызывает QFileDialog::getOpenFileName
Отправлено: GreatSnake от Апрель 25, 2013, 15:58
Можно в перегруженном QStyledItemDelegate::eventFilter() игнорировать QEvent::FocusOut для такого случая.


Название: Re: Крах приложения QStyledItemDelegate вызывает QFileDialog::getOpenFileName
Отправлено: burevestnik от Апрель 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);
}


Название: Re: Крах приложения QStyledItemDelegate вызывает QFileDialog::getOpenFileName
Отправлено: burevestnik от Апрель 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);
}