crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2008, 13:23
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в итоге: список видимых (или тех, что сверху) в данный момент доквиджетов.

да, уместнее было бы чтобы это была функция QMainWindow, например: QList<QWidget*> QMainWindow::topDocWidgetsList()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.12.2008, 13:34
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я предлагаю не ограничиваться только этой задачей. Т.к. переключение табов, добавление, удаление виджета из/в таб/а програмным методом было бы тоже интересно. Правда я не пробывал, возможно ли сейчас сложить в табы выбранные доквиджеты програмным методом ? Это надо move() делать на заданные координаты или флаги какие устанавливать ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 26.12.2008, 13:48
Сообщение #13


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(SABROG @ 26.12.2008, 12:12) *
Цитата(kwisp @ 26.12.2008, 10:16) *
не поможет?

Совершенно. QMainWindow использует QTabBar'ы, не QTabWidget'ы. А в QTabBar'е есть только currentIndex.
Но опять же стандартными методами через QMainWindow невозможно получить список указателей на QTabBar'ы, если таковые существуют. А их может и не быть, если пользователь не манипулировал с доками.

Цитата(Litkevich Yuriy @ 26.12.2008, 10:54) *
SABROG, вобщем, тему стоит пожевать и найти решение. Я думаю надо делать либо класс "организатор", либо наследника более умного от QDockWidget.

Если делать умного наследника от QDockWidget'а, то что это должно дать ? Проверку типа isTopWidget() ?
Класс организатор тоже решение. Хоть и правильное решение с точки зрения программирования, но достаточно непростое и скорее смахивает на затычку.

По-хорошему надо написать и класс-менеджер и добавить в таск-лист троллям, что хотелось бы иметь подобную возможность. Т.е. добавить методы для QMainWindow и доп.класс типа QDockTabBar на базе QTabBar:
QList <QDockTabBar *> QMainWindow::dockTabBars() const

Для класса QDockTabBar метод:
QDockWidget * QDockTabBar::currentWidget() const
void QDockTabBar::setCurrentWidget(QDockWidget *dw)

Может еще какие-то.


прошу прощения
в Qt 4.4.3. есть
int QTabBar::currentIndex()const;
void QTabBar::currentChanged(int);[signal]

очепятка вышла.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.12.2008, 14:03
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(kwisp @ 26.12.2008, 13:48) *
прошу прощения
в Qt 4.4.3. есть
int QTabBar::currentIndex()const;
void QTabBar::currentChanged(int);[signal]

очепятка вышла.


Опять же. Ты не можешь стандартными методами QMainWindow получить указатели на QTabBar'ы.
И полученные сигналы и индексы бесполезны, если нет возможности связать их с конкретными виджетами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.12.2008, 23:12
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


В общем решил развить тему сигнала visibilityChanged. На этот раз метод должен работать везде, т.к. привязки к нестандартным вещам нет :)

В конструкторе соединями сигналы каждого QDockWidget'а к одному слоту. Можно соединять вручную поименно каждый виджет, как удобнее. Просто с учетом на будущее я решил пробежаться по всем детишкам, мало ли добавится еще пара окон.
DockWidgets::DockWidgets(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    QList <QDockWidget *> lst = findChildren<QDockWidget *>();
    foreach(QDockWidget *widget, lst)
    {
        connect(widget, SIGNAL(visibilityChanged(bool)), SLOT(slotVisibilityChanged(bool)));
    }
}


Наш слот. Хочу заметить, что он вызывается для каждого доквиджета при открытии главного окна с параметром true. Далее при перетаскивании любого доквиджета слот вызывается 4 раза. Сначала доквиджет скрывается (false), появляется плавающее окно (true), когда перетаскивание завершается, плавающий доквиджет скрывается (false), и вновь отображается уже в доке (true). При складывании доквиджетов в таббар приходят наши две пары сигналов плюс еще пара сигналов, всего 6 сигналов для одного виджета. Кроме этого приходит еще один сигнал с того виджета, который скрывается под перетащенным.

void DockWidgets::slotVisibilityChanged(bool visible)
{
    QObject *sndr = sender();
    if (sndr)
    {
        sndr->setProperty("dockIsVisible", visible);
        qDebug()
        << "CName:" << sndr->metaObject()->className()
        << "WTitle: " << sndr->property("windowTitle").toString()
        << "isVisible(): " << sndr->property("visible").toString()
        << "vChange: " << sndr->property("dockIsVisible").toString();
    }
}


Логика следующая. Мы добавляем динамический параметр к каждому QDockWidget'у, который отображает его текущее состояние. В любой момент можно будет узнать какой доквиджет в данный момент не скрыт. По сути это аналог параметру visible у QWidget, но по неизвестным мне причинам он не работает. Отладочный вывод это показывает на последних строчках.

CName: QDockWidget WTitle:  "2" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "1" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "3" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "4" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "5" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "6" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "7" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "8" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "9" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "10" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "3" isVisible():  "false" vChange:  "false"
CName: QDockWidget WTitle:  "3" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "3" isVisible():  "false" vChange:  "false"
CName: QDockWidget WTitle:  "3" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "3" isVisible():  "true" vChange:  "false"
CName: QDockWidget WTitle:  "3" isVisible():  "true" vChange:  "true"
CName: QDockWidget WTitle:  "2" isVisible():  "true" vChange:  "false"


Пока я не затрагиваю тему управления QTabBar'ом.

Как вам такой вариант решения ?

Сообщение отредактировал SABROG - 26.12.2008, 23:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.12.2008, 23:19
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


SABROG, чёто с форматированием, как-то все плохо :(

Цитата(SABROG @ 27.12.2008, 2:12) *
isVisible()
этот метод имеет связь с методами show() и hide(), т.е. для определения виден ли пользователю определенно не подходит

для С++ кода надо использовать параметр в тэге код:
[code=cpp][/code]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 26.12.2008, 23:23
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 26.12.2008, 23:19) *
SABROG, чёто с форматированием, как-то все плохо :(

Цитата(SABROG @ 27.12.2008, 2:12) *
isVisible()
этот метод имеет связь с методами show() и hide(), т.е. для определения виден ли пользователю определенно не подходит

для С++ кода надо использовать параметр в тэге код:
[code=cpp][/code]

С форматированием беда какая-то. При выборе cpp подсветка не отображается вообще. Если же пользовать "Код с подсветкой" вместо "Код", то код почему-то идентифицируется как perl, при том, что я указал cpp. Но даже в perl подсвечиваются только 2 слова. Еще текст весь поломался из-за того, что я не заметил закрытый тег код, который не открывал.

Просто по логике, если окно исчезает, значит оно должно хайдиться чтоли :) Надо посмотреть как это организовано в QTabWidget.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 0:51
Сообщение #18


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 27.12.2008, 2:23) *
Просто по логике, если окно исчезает, значит оно должно хайдиться чтоли
что значит исчезает?
Если два доквиджета сложены вкладками и одному скомандывать hide(), то его вкладка исчезнет - виджет спрячится и isVisible() вернет "ложь"

Цитата(SABROG @ 27.12.2008, 2:23) *
При выборе cpp подсветка не отображается вообще
ну как видишь отображается

в первом блочке стандартных С++ных слов только два: this и bool
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 27.12.2008, 13:35
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(Litkevich Yuriy @ 27.12.2008, 0:51) *
что значит исчезает?
Если два доквиджета сложены вкладками и одному скомандывать hide(), то его вкладка исчезнет - виджет спрячится и isVisible() вернет "ложь"

Я еще вчера посмотрел, в QTabWidget используется QStackedWidget, а он ничего не хайдит. В общем все понятно.
Цитата(Litkevich Yuriy @ 27.12.2008, 0:51) *
ну как видишь отображается

в первом блочке стандартных С++ных слов только два: this и bool

Скудная подсветка просто, сразу не понял, другие хайлайтеры и скобочками со звездочками перекрашивают.

А по теме есть что-нибудь ? Думаю менеджер классов делать бессмысленно, если есть динамические свойства. Стоит в вики внести оба варианта, с reinterpret как дополнительный ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 14:00
Сообщение #20


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 27.12.2008, 16:35) *
Стоит в вики внести оба варианта, с reinterpret как дополнительный ?
если есть желание напиши в ЧаВо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 2:21