Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MDI приложение, работа с активным окном 
V
    Опции темы
Maxsyuk
Дата 13.3.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Доброго всем времени суток.
Перейду сразу к проблеме. Необходимо создать mdi-приложение, которое работает с графическим представлением. Возникает проблема при попытке работы с активным окном, здесь: 
Код

void MainWindow::slotTest()
{
    qDebug()<<mdiArea->activeSubWindow();
    GraphicsView* view = qobject_cast<GraphicsView*>(mdiArea->activeSubWindow());
    if (view) qDebug()<<"успех";
}


в консоли видим следующее:
Код

QMdiSubWindow(0x15e3330)


Создание mdiArea и добавление subWindow:

Код

//создаем mdiArea
void MainWindow::createMdiArea()
{
    mdiArea = new MdiArea;
    mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    setCentralWidget(mdiArea);
    signalMapper = new QSignalMapper(this);
    connect(signalMapper,SIGNAL(mapped(QWidget*)),mdiArea,SLOT(setActiveSubWindow(QMdiSubWindow*)));

}
//создаем subWindow
GraphicsView* MainWindow::createNewGraphicsView()
{
    graphicsViewWindow = new GraphicsView;
    mdiArea->addSubWindow(graphicsViewWindow);
    graphicsViewWindow->setAttribute(Qt::WA_DeleteOnClose);
    graphicsViewWindow->setWindowTitle("Unnamed window");
    return graphicsViewWindow;
}


Теперь нужно разобраться в каком месте я дурак.

Это сообщение отредактировал(а) Maxsyuk - 13.3.2012, 12:17
PM MAIL   Вверх
_GRIN_
Дата 13.3.2012, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



Код

void MainWindow::slotTest()
{
    qDebug()<<mdiArea->activeSubWindow();
    GraphicsView* view = qobject_cast<GraphicsView*>(mdiArea->currentSubWindow());
    if (view) qDebug()<<"успех";
}


В лог выводишь activeSubWindow(), а кастишь currentSubWindow()!

Цитата

QMdiSubWindow * QMdiArea::currentSubWindow () const

Returns a pointer to the current subwindow, or 0 if there is no current subwindow.

This function will return the same as activeSubWindow() if the QApplication containing QMdiArea is active.


Может у тебя приложение не активно?

Это сообщение отредактировал(а) _GRIN_ - 13.3.2012, 12:23


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Maxsyuk
Дата 13.3.2012, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Цитата

В лог выводишь activeSubWindow(), а кастишь currentSubWindow()!

Да нет как раз таки, везде activeSubWindow()
PM MAIL   Вверх
Maxsyuk
Дата 14.3.2012, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Проблема решена своими руками, оказалось все просто:
Код

qDebug()<<mdiArea->activeSubWindow();
GraphicsView* view = qobject_cast<GraphicsView*>(mdiArea->activeSubWindow()->widget());
if (view) qDebug()<<tr("успех");


Цитата

QObject содержит шаблонную функцию T qobject_cast<T>( QObject* object ), которую можно использовать для проверки и приведения типов. В результате выполнения возвращается указатель на объект класса T, если object является объектом класса T или его потомков. Иначе возвращается 0.

PM MAIL   Вверх
_GRIN_
Дата 14.3.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: 6
Всего: 7



а у тебя GraphicsView - это не наследник от QGraphicsView ?


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
Maxsyuk
Дата 14.3.2012, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 12.3.2012

Репутация: нет
Всего: нет



Как раз таки наследуется от QGraphicsView
PM MAIL   Вверх
math64
Дата 14.3.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Кстати, проверь в Linux - поведение может отличаться.
Код

    QMdiSubWindow* subWindow = mdiArea->addSubWindow(graphicsViewWindow);
    subWindow->showMaximized(); // Без этого окно может остаться невидимым
    mdiArea->setActiveSubWindow(subWindow); // Без этого activeSubWindow() может вернуть NULL

Поскольку activeSubWindow() может вернуть NULL (например, открытых окон нет), его нужно проверять на NULL.
Вероятно, такую проверку нужно делать в нескольких местах. Можно написать вспомогательную функцию:
Код

GraphicsView* MainWindow::activeGraphicsView()
{
    QMdiSubWindow* subWindow = mdiArea->activeSubWindow();
    if (!subWindow)
        return NULL;
    return qobject_cast<GraphicsView*>(subWindow->widget());
}


Это сообщение отредактировал(а) math64 - 14.3.2012, 10:04
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.