Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: babutta от Май 27, 2010, 09:28



Название: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 09:28
Доброго всем времени суток!  :)

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

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

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

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

Есть какие-нибудь варианты создать панель и при создании не размещать ее на главном окне, а сделать сразу отдельно плавающей, но естественно с возможностью дальнейшего размещения ее на главном окне? =)


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: GreatSnake от Май 27, 2010, 09:31
void   QDockWidget::setFloating ( bool floating )


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 10:05
Не понял... бррр-р-р... =)
Будь добр, поясни... Вообще я спрашивал о том как создать панель, т.е. QToolBar, а не док виджет...


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


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 11:07
...а как получить доступ к QToolBarPrivate?
судя по названию, экземпляр этого класса скрывается в приватной секции QToolBar...


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: GreatSnake от Май 27, 2010, 11:43
#include "qtoolbar_p.h"

toolBar->d_func()->setWindowState( true, true, QRect( 100, 100, 200, 40 ));


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 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'

Получается и в наследнике не добраться, т.к. это приватная тема =(


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: MoPDoBoPoT от Май 27, 2010, 12:28
...а как получить доступ к QToolBarPrivate?
http://www.forum.crossplatform.ru/index.php?showtopic=981&view=findpost&p=32527


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: GreatSnake от Май 27, 2010, 13:16
babutta
Ничего не получится, т.к. класс QToolBarPrivate не экспортится :(
Мде, тролли запрятали опять от нас всё - близ локоток, а не укусишь...


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 13:35
...а как получить доступ к QToolBarPrivate?
http://www.forum.crossplatform.ru/index.php?showtopic=981&view=findpost&p=32527

Благодарю, почитаю.


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 13:36
babutta
Ничего не получится, т.к. класс QToolBarPrivate не экспортится :(
Мде, тролли запрятали опять от нас всё - близ локоток, а не укусишь...

ну может быть когда-нибудь это станет доступным =)


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: GreatSnake от Май 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();
}
 


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

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


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: GreatSnake от Май 27, 2010, 15:12
Нужно toolbar поместить на QMainWindow используя QMainWindow::addToolBar и заполнить его и уже потом отсоединять.


Название: Re: Как создать панель инструментов не на главном окне?
Отправлено: babutta от Май 27, 2010, 15:18
Нужно toolbar поместить на QMainWindow используя QMainWindow::addToolBar и заполнить его и уже потом отсоединять.

ага, работает!  :)

Благодарю!  :)