crossplatform.ru

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


  Ответ в Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 4.3.2009, 5:50
  из изменений в 4.5.0:
Цитата
- QMainWindow
* added API to know which dock widgets are tabified together with a dock widget
тык
Litkevich Yuriy Дата 27.12.2008, 14:00
 
Цитата(SABROG @ 27.12.2008, 16:35) *
Стоит в вики внести оба варианта, с reinterpret как дополнительный ?
если есть желание напиши в ЧаВо
SABROG Дата 27.12.2008, 13:35
 
Цитата(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, 0:51
 
Цитата(SABROG @ 27.12.2008, 2:23) *
Просто по логике, если окно исчезает, значит оно должно хайдиться чтоли
что значит исчезает?
Если два доквиджета сложены вкладками и одному скомандывать hide(), то его вкладка исчезнет - виджет спрячится и isVisible() вернет "ложь"

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

в первом блочке стандартных С++ных слов только два: this и bool
SABROG Дата 26.12.2008, 23:23
 
Цитата(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 Дата 26.12.2008, 23:19
  SABROG, чёто с форматированием, как-то все плохо :(

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

для С++ кода надо использовать параметр в тэге код:
[code=cpp][/code]
SABROG Дата 26.12.2008, 23:12
  В общем решил развить тему сигнала 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, 14:03
 
Цитата(kwisp @ 26.12.2008, 13:48) *
прошу прощения
в Qt 4.4.3. есть
int QTabBar::currentIndex()const;
void QTabBar::currentChanged(int);[signal]

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


Опять же. Ты не можешь стандартными методами QMainWindow получить указатели на QTabBar'ы.
И полученные сигналы и индексы бесполезны, если нет возможности связать их с конкретными виджетами.
kwisp Дата 26.12.2008, 13:48
 
Цитата(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, 13:34
  Я предлагаю не ограничиваться только этой задачей. Т.к. переключение табов, добавление, удаление виджета из/в таб/а програмным методом было бы тоже интересно. Правда я не пробывал, возможно ли сейчас сложить в табы выбранные доквиджеты програмным методом ? Это надо move() делать на заданные координаты или флаги какие устанавливать ?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 18:48