Russian Qt Forum

Qt => Общие вопросы => Тема начата: foufou от Сентябрь 03, 2010, 19:43



Название: Работа Qt приложения под Windows и Linux
Отправлено: foufou от Сентябрь 03, 2010, 19:43
Пишу программку в Qt Creator, имея на компе Windows. Решил проверить как оно работает под линуксом. Линукс мне принесли на загрузочной флешке, загрузился, запустил установленный на этой флешке Qt Creator и запустил свою программку. Оказалось, кое-что из того, что работает под Windows, отказывается работать под Линукс.

У меня MDI приложение. Есть главное окно и дочерние окна. Чтобы сделать нечто в активном дочернем окошке вызываю модальное диалоговое окно и по нажатию на кнопку ОК делаю, что хотел. В частности, добавляю колонки в таблице QTableWidget. Число колонок, которые необходимо добавить получаю из диалогового окна. Под виндой все работает, а вот под Линукс работать отказывается.

Следующий код работает под Windows, но не работает под Linux:

Цитировать
void MainWindow::addNewColumns()
{
    dialogAddColumns *dialogAddCols = new dialogAddColumns;
   
    if (dialogAddCols->exec() == QDialog::Accepted)
    {
        QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow();

        if (activeSubWindow) // под Линуксом это условие никогда не выполняется !!!
        {
      Добавить колонки...
      
   }
    }
}

Что значит программа не работает ? Просто во внутренний if программа никогда не заходит, как-будто нет никакого активного дочернего окна.

Опытным путем установил, что проблему можно решить, если вынести строку QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow() выше - туда, где диалоговое окно еще не объявляется:

Цитировать
void MainWindow::addNewColumns()
{
    QMdiSubWindow *activeSubWindow = mdiArea->activeSubWindow();
   
    dialogAddColumns *dialogAddCols = new dialogAddColumns;   
    if (dialogAddCols->exec() == QDialog::Accepted)
    {       
        if (activeSubWindow)
        {
          Добавить колонки...
   }
    }
}   

Вот это работает и под Windows, и под Linux. Не понимаю в чем была проблема ??? Чем мешает диалоговое окошко Линуксу найти активное дочернее окно ?


Название: Re: Работа Qt приложения под Windows и Linux
Отправлено: Sancho_s_rancho от Сентябрь 03, 2010, 20:47
Мне видется, что после модального окна нет фукуса ни на одном окошке области mdi. Т.е. в винде окошко после диалога сново фокус получает, а в линукс - нет. Может это фича такая, может бага.


Название: Re: Работа Qt приложения под Windows и Linux
Отправлено: foufou от Сентябрь 03, 2010, 21:07
Мне видется, что после модального окна нет фукуса ни на одном окошке области mdi. Т.е. в винде окошко после диалога сново фокус получает, а в линукс - нет. Может это фича такая, может бага.

Спасибо ! Очень похоже, что так оно и есть. Получается, что надо запоминать кто из дочерних окон в фокусе еще до открытия диалогового окна, т.е. так, как я это и попытался сделать. Просто не всегда это удобно.


Название: Re: Работа Qt приложения под Windows и Linux
Отправлено: Pretorean от Сентябрь 04, 2010, 00:17
Код:
dialogAddColumns *dialogAddCols = new dialogAddColumns(this);