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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как создать панель инструментов не на главном окне?  (Прочитано 8580 раз)
babutta
Гость
« : Май 27, 2010, 09:28 »

Доброго всем времени суток!  Улыбающийся

Хочу создать QToolBar, но не располагать его сразу на главном окне, а что б он сразу был плавающим, свободным... таким каким он становится когда его вытаскивают из его пространства панелей где он находился на главном окне, и не вставляют в новое пространство (Qt::ToolBarAreas).

Если при создании панели в качестве parent передать NULL, то его просто не видно. А если ему сказать show(), то он появляется как отдельное окно - со своим заголовком, кнопками свернуть, распахнуть, закрыть и т.п. И естественно он не хочет встраиваться в пространства панелей главного окна.

А если панели в качестве parent'а передать главное окно, но не вызывать у главного окна addToolBar(), то происходят глюки отображения (панель становится какой-то полупрозрачной), которые приводят к падению программы при попытке перетащить такую панель...

...использую Qt 4.5.1

Есть какие-нибудь варианты создать панель и при создании не размещать ее на главном окне, а сделать сразу отдельно плавающей, но естественно с возможностью дальнейшего размещения ее на главном окне? =)
« Последнее редактирование: Май 27, 2010, 09:30 от babutta » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 27, 2010, 09:31 »

void   QDockWidget::setFloating ( bool floating )
Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #2 : Май 27, 2010, 10:05 »

Не понял... бррр-р-р... =)
Будь добр, поясни... Вообще я спрашивал о том как создать панель, т.е. QToolBar, а не док виджет...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Май 27, 2010, 10:41 »

Виноват, ляпнул не разобравшись наивно полагая, что Qt использует QDockWidget и для тулбаров тоже.
После исследования исходников, могу сказать, что используя публичный API отцепить toolbar от mainwindow не получится.
Если сильно хочется, то можно использовать void QToolBarPrivate::setWindowState(bool floating, bool unplug, const QRect &rect).
Но это будет скорее всего уже hack.
Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #4 : Май 27, 2010, 11:07 »

...а как получить доступ к QToolBarPrivate?
судя по названию, экземпляр этого класса скрывается в приватной секции QToolBar...
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 27, 2010, 11:43 »

#include "qtoolbar_p.h"

toolBar->d_func()->setWindowState( true, true, QRect( 100, 100, 200, 40 ));
Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #6 : Май 27, 2010, 11:54 »

Код:
    QToolBar* pTB = new QToolBar( tr( "Панель 1" ), this );
    pTB->d_func()->setWindowState( true, true, QRect( 100, 100, 200, 40 ) );

компилятор выдает:
error C2248: 'QToolBar::d_func' : cannot access private member declared in class 'QToolBar'

Получается и в наследнике не добраться, т.к. это приватная тема =(
« Последнее редактирование: Май 27, 2010, 11:57 от babutta » Записан
MoPDoBoPoT
Гость
« Ответ #7 : Май 27, 2010, 12:28 »

...а как получить доступ к QToolBarPrivate?
http://www.forum.crossplatform.ru/index.php?showtopic=981&view=findpost&p=32527
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Май 27, 2010, 13:16 »

babutta
Ничего не получится, т.к. класс QToolBarPrivate не экспортится Грустный
Мде, тролли запрятали опять от нас всё - близ локоток, а не укусишь...
« Последнее редактирование: Май 27, 2010, 13:18 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #9 : Май 27, 2010, 13:35 »


Благодарю, почитаю.
Записан
babutta
Гость
« Ответ #10 : Май 27, 2010, 13:36 »

babutta
Ничего не получится, т.к. класс QToolBarPrivate не экспортится Грустный
Мде, тролли запрятали опять от нас всё - близ локоток, а не укусишь...

ну может быть когда-нибудь это станет доступным =)
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Май 27, 2010, 13:59 »

На самом деле всё оказалось намного проще:

Код
C++ (Qt)
void UndockToolBar( QToolBar* tb )
{
tb->hide();
 
tb->setWindowFlags(
Qt::Tool | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint
#ifdef Q_WS_MAC
| Qt::WindowStaysOnTopHint
#endif
);
 
tb->adjustSize();
tb->move( 100, 100 );
 
tb->show();
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #12 : Май 27, 2010, 15:06 »

Попробовал...
Вот этот вариант не подходит, т.к. созданный тулбар невозможно таскать - не перетаскивается за сам тулбар, и кэпшина  для таскания тоже нет...
Код:
    pTB = new QToolBar( tr( "Панель 2" ), NULL );
    UndockToolBar( pTB );

а этот:
Код:
    pTB = new QToolBar( tr( "Панель 2" ), this ); // this - это QMainWindow
    UndockToolBar( pTB );
приводит к крушению приложения при попытке переместить панель инструментов =(
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Май 27, 2010, 15:12 »

Нужно toolbar поместить на QMainWindow используя QMainWindow::addToolBar и заполнить его и уже потом отсоединять.
Записан

Qt 5.11/4.8.7 (X11/Win)
babutta
Гость
« Ответ #14 : Май 27, 2010, 15:18 »

Нужно toolbar поместить на QMainWindow используя QMainWindow::addToolBar и заполнить его и уже потом отсоединять.

ага, работает!  Улыбающийся

Благодарю!  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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