Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: muaddib1981@mail.ru от Ноябрь 25, 2008, 11:46



Название: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 11:46

Как скрыть заголовок дочернего окна?



Название: Re: вопрос по дочернему окну
Отправлено: Hort от Ноябрь 25, 2008, 11:53
Как скрыть заголовок дочернего окна?
например так
Код
C++ (Qt)
setWindowFlags(Qt::Popup);


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 12:09
Не получается:

Код
C++ (Qt)
class THelpDialog:public QWidget
{
public:
THelpDialog(int sizex, int sizey);
~THelpDialog(void);
       ...
};
 
 
THelpDialog::THelpDialog(int sizex, int sizey)
{
   this->setWindowFlags(Qt::Popup);
   ...
};
 
class TPlayWindow:public QMainWindow
{
public:
TPlayWindow(int sizex, int sizey);
~TPlayWindow(void);
private:
QMdiArea *mdiarea;
};
 
TPlayWindow::TPlayWindow(int sizex, int sizey)
{
this->setFixedWidth(sizex);
this->setFixedHeight(sizey);
 
       mdiarea=new QMdiArea();
this->setCentralWidget(mdiarea);
 
THelpDialog *helpdialog=new THelpDialog(0.8*this->width(),1.0/26*this->height());
mdiarea->addSubWindow(helpdialog,Qt::Popup);
 
}

Причем если окно не дочернее, а виджет который прикрепляется на layout, то все работает, если окно дочернее появляется заголовок.


Название: Re: вопрос по дочернему окну
Отправлено: Hort от Ноябрь 25, 2008, 12:16
работать с окнами QMdiArea надо через класс QMdiSubWindow
метод addSubWindow() возвращает указатель на созданный QMdiSubWindow
следовательно в твоем случае надо так:
Код
C++ (Qt)
mdiarea->addSubWindow(helpdialog,Qt::Popup)->setWindowFlags(Qt::Popup);


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 12:26
Нет все равно, не работает. Может существует какой-нибудь другой способ, в обход setWindowFlags?


Название: Re: вопрос по дочернему окну
Отправлено: Hort от Ноябрь 25, 2008, 12:34
Нет все равно, не работает. Может существует какой-нибудь другой способ, в обход setWindowFlags?
а чем тебе не подходит обычное всплывающее окно? МидиАреа вообще-то предназначена какбы не совсем для этого


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 12:38
мне нужно, чтобы в окне были виджеты без заголовков. Перетаскивать мышью я их собираюсь ухватываясь не за заголовок а за сам виджет. Но чтобы виджеты не попадали за пределы окна. Т.е. мне нужно:
1) виджеты без заголовков
2) запретить возможность перетаскивания за пределы окна.


Название: Re: вопрос по дочернему окну
Отправлено: Hort от Ноябрь 25, 2008, 12:47
поробовалы только что у себя подобное
Код:
mdiarea->addSubWindow(helpdialog,Qt::Popup)->setWindowFlags(Qt::Popup);
действительно ведет себя очень странно.

Есть еще один вариант - поробуй сделать это через QWorkspace
Бывает такое, что то что глючит на QMidiArea нормально работает в QWorkspace и наоборот.
В своем проекте не буду проверять - прийдется сильно много переделывать.


Название: Re: вопрос по дочернему окну
Отправлено: BRE от Ноябрь 25, 2008, 12:56
Бывает такое, что то что глючит на QMidiArea нормально работает в QWorkspace и наоборот.
В своем проекте не буду проверять - прийдется сильно много переделывать.

Цитата из QAssistant по классу QWorkspace:
Цитировать
This class is deprecated. Use QMdiArea instead.
QWorkspace могут убрать из Qt в любой момент.


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 13:01
Код
C++ (Qt)
class TPlayWindow:public QMainWindow
{
public:
TPlayWindow(int sizex, int sizey);
~TPlayWindow(void);
private:
QWorkspace *workspace;
};
 
TPlayWindow::TPlayWindow(int sizex, int sizey)
{
this->setFixedWidth(sizex);
this->setFixedHeight(sizey);
 
       workspace=new QWorkspace();
this->setCentralWidget(workspace);
 
THelpDialog *helpdialog=new THelpDialog(0.8*this->width(),1.0/26*this->height());
workspace->addWindow(helpdialog,Qt::Popup)->setWindowFlags(Qt::Popup);
 
}

//Пользуйся тэгом КОД для оформления исходного кода!


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 25, 2008, 13:03
Глючит, все равно. Окно просто не появляется. Если просто workspace->addWindow(helpdialog); то появляется, но с заголовком!


Название: Re: вопрос по дочернему окну
Отправлено: spirit от Ноябрь 25, 2008, 13:15
Код
C++ (Qt)
QWorkspace *workspace = new QWorkspace;
workspace->addWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint);
setCentralWidget(workspace);
 
enjoy!


Название: Re: вопрос по дочернему окну
Отправлено: Racheengel от Ноябрь 25, 2008, 14:57
По моему, надо еще Qt::FramelessWindowHint добавить:

Код:
workspace->addWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);



Название: Re: вопрос по дочернему окну
Отправлено: spirit от Ноябрь 25, 2008, 14:59
По моему, надо еще Qt::FramelessWindowHint добавить:

Код:
workspace->addWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);


и без этого работает чудесно.


Название: Re: вопрос по дочернему окну
Отправлено: spirit от Ноябрь 25, 2008, 16:03
ага, нельзя будет ресайзить виджет  :)


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 26, 2008, 09:22
Как теперь убрать синюю рамку, которая обрамляет окно?



Название: Re: вопрос по дочернему окну
Отправлено: spirit от Ноябрь 26, 2008, 09:25
см.посты выше, а именно Racheengel
Цитировать
По моему, надо еще Qt::FramelessWindowHint добавить:

Code:
workspace->addWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
Qt::FramelessWindowHint
но если использовать этот флаг, то растягивать мышкой окно уже не получится.


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 26, 2008, 09:29
workspace->addWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint); не работает. Скриншот приведенный выше взят уже с Qt::FramelessWindowHint.


Название: Re: вопрос по дочернему окну
Отправлено: spirit от Ноябрь 26, 2008, 09:32
возьми поиграйся с примером QTDIR/examples/widgets/windowflags/.
и про Qt::WindowFlags почитай.


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 26, 2008, 10:08
QTDIR/examples/widgets/windowflags/  там не дочерние окна, а просто виджет. Там все работает, и что казалось бы должно работать и в дочерних окнах, но не работает. Просто по виджетам у меня вопросов нет.


Название: Re: вопрос по дочернему окну
Отправлено: Racheengel от Ноябрь 26, 2008, 11:22
Во-во-во, я замечал такой баг в QWorkspace - флагами рамку вокруг окна убрать не получается.
Честно говоря, в свое время проблему так и не смогли решить, тролям зарепортили, но внятного ответа так и не получили.
В QMdiArea помоему этого бага уже нет, но там какая то другая лажа оказалась - то ли мышой окна не тягались, то ли еще что то , не помню (давно проект делали).


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 26, 2008, 15:06
там лажа заключается в том, что в моем случае нельзя убрать заголовок окна при помощи
mdiarea->addSubWindow(new QWidget, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
где mdiarea это QMdiArea *mdiarea;

Приходится пользоваться устаревшим QWorkspace.


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Ноябрь 28, 2008, 10:43
Добавил в класс THelpDialog макрос Q_OBJECT, чтобы определять нажатие кнопки

Код
C++ (Qt)
class THelpDialog:public QWidget
{
Q_OBJECT
public:
THelpDialog(int sizex, int sizey);
~THelpDialog(void);
       ...
};

helpdialog, являясь дочерним окном стал прозрачным, глюки какие-то.
Причем QPushButton и QLabel которые на этом виджете, нормальные, не прозрачные.
helpdialog->setWindowOpacity(1); не работает.


Этот код:
Код
C++ (Qt)
...
QWidget *widget;
widget=workspace->addWindow(helpdialog, Qt::Widget | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
widget->setWindowOpacity(1);
...

тоже не работает.

Как вернуть виджету прозрачность?

//Повторяю ещё раз! Пользуйся тэгом КОД для оформления исходного кода!


Название: Re: вопрос по дочернему окну
Отправлено: muaddib1981@mail.ru от Декабрь 02, 2008, 14:41
С дочерним окном все решено. Можно использовать свойство setParent, для создания дочернего окна!

Код:

THelpDialog *helpdialog=new THelpDialog(0.8*this->width(),1.0/26*this->height());
helpdialog->setParent(this);
helpdialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint);


никакой обрамляющей рамки при этом нет.


Название: Re: вопрос по дочернему окну
Отправлено: spirit от Декабрь 02, 2008, 15:17
дык, надо ж было сразу сказать, что вам именно нужно.
ЗЫ. парент в конструктор обычно передают.