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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа Qt приложения под Windows и Linux  (Прочитано 3100 раз)
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. Не понимаю в чем была проблема Непонимающий Чем мешает диалоговое окошко Линуксу найти активное дочернее окно ?
Записан
Sancho_s_rancho
Гость
« Ответ #1 : Сентябрь 03, 2010, 20:47 »

Мне видется, что после модального окна нет фукуса ни на одном окошке области mdi. Т.е. в винде окошко после диалога сново фокус получает, а в линукс - нет. Может это фича такая, может бага.
Записан
foufou
Гость
« Ответ #2 : Сентябрь 03, 2010, 21:07 »

Мне видется, что после модального окна нет фукуса ни на одном окошке области mdi. Т.е. в винде окошко после диалога сново фокус получает, а в линукс - нет. Может это фича такая, может бага.

Спасибо ! Очень похоже, что так оно и есть. Получается, что надо запоминать кто из дочерних окон в фокусе еще до открытия диалогового окна, т.е. так, как я это и попытался сделать. Просто не всегда это удобно.
Записан
Pretorean
Гость
« Ответ #3 : Сентябрь 04, 2010, 00:17 »

Код:
dialogAddColumns *dialogAddCols = new dialogAddColumns(this);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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