Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: muaddib1981@mail.ru от Декабрь 17, 2008, 12:50



Название: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 12:50
Есть следующий код:

Код:

#include <QtGui>

class TChildWindow:public QMainWindow
{
public:
TChildWindow(void);
~TChildWindow(void);
private:
void virtual mousePressEvent(QMouseEvent *event);
};
//-------------------------------------------------------

#include "TChildWindow.h"

TChildWindow::TChildWindow(void)
{
setStyleSheet("background-color: gray");
}

TChildWindow::~TChildWindow(void)
{
}

void TChildWindow::mousePressEvent(QMouseEvent *event)
{
   this->close();
};

//----------------------------------------

#include <QtGui>
#include "TChildWindow.h"

class TMainWindow:public QMainWindow
{
Q_OBJECT
public:
TMainWindow(void);
~TMainWindow(void);
private:
    TChildWindow *childwindow;
QWidget *mainWidget;
QGridLayout *layout;
QPushButton *button;
public slots:
    void slotPushButton(void);
};

//---------------------------

#include "TMainWindow.h"

TMainWindow::TMainWindow(void)
{

mainWidget=new QWidget();
    layout=new QGridLayout();
mainWidget->setLayout(layout);
this->setCentralWidget(mainWidget);

button=new QPushButton("OK");
layout->addWidget(button);

childwindow=new TChildWindow();
connect(button,SIGNAL(clicked()),this,SLOT(slotPushButton()));
}

TMainWindow::~TMainWindow(void)
{
}

void TMainWindow::slotPushButton(void)
{
childwindow->setParent(this);
childwindow->setFixedWidth(this->width()/2);
childwindow->setFixedHeight(this->height()/2);
childwindow->move(20,20);
    childwindow->setWindowModality(Qt::WindowModal);
childwindow->show();
};

//---------------------------------------

int main (int argc, char* argv[] )
{
QApplication app(argc, argv);
       TMainWindow *window=new TMainWindow();
window->show();
return app.exec();
delete window;
}


MousePressEvent не вызывается если дочернее окно модальное:  childwindow->setWindowModality(Qt::WindowModal);   



Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 12:54
это сильно  ;)
Код:
...
return app.exec();
delete window;
...


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 12:55
Да невнимательно писал, сорри.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 13:12
добавь парента в TChildWindow и будет работать.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 13:15
Это как? Я вроде делаю: childwindow->setParent(this);


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 13:18
Код
C++ (Qt)
TChildWindow::TChildWindow(QWidget *parent)
: QMainWindow(parent)
{
setStyleSheet("background-color: gray");
}
...
childwindow=new TChildWindow(this);
...
 


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 13:26
не работает, вернее работает, но не как надо. childwindow с этим кодом можно передвигать за пределы родительского окна, а мне надо чтобы TMainWindow нельзя было.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 13:28
а почему QDialog нельзя использовать?


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 14:02
Надо попробовать.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 14:07
Точно также, если не добавлять parent, то mousePressEvent не вызывается, а если добавить, то дочернее окно выходит за пределы родительского окна.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: pastor от Декабрь 17, 2008, 14:49
А какое поведение нужно получить в итоге? Может лучше посомтреть в сторону QMdiArea + QMdiSubWindow?


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 15:00
Мне нужно:

1) дочернее окно окно должно быть модальным
2) дочернее окно должно быть без title bar (как раз получается при помощи setParent, при QMdiArea и QMdiSubWindow такое получить не удается)
3) дочернее окно не должно выходить за пределы родительского окна (опять же setParent, меня устраивал но на модальных дочерних окнах не вызывается mousePressEvent).



Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 15:08
и это дочернее окно должно двигаться внутри парента?


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: muaddib1981@mail.ru от Декабрь 17, 2008, 15:18
Совершенно верно!


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: spirit от Декабрь 17, 2008, 15:21
ну если QWorspace || QMdiArea не подходит, тогда можно создать виджет указав паренто, но убрать тайтл, следить чтобы этот виджет не выходил за размеры парента + самому реализовать перетаскивание за любую область виджета.


Название: Re: модальный QMainWindow и mousePressEvent
Отправлено: SABROG от Декабрь 17, 2008, 16:05
Изначально забавная задачка. Создать модальное дочернее окно, которое должно быть единственно активным среди таких же дочек, с теми же правами. Это равносильно тому, чтобы кинуть на форму 10 кнопок, одну из них сделать модальной, она должна будет работать, а другие 9 ждать пока на нее не нажмут...

В QDialog'e используется собственный QEventLoop, в то время как для главного окна и его деток он один и запустив модальную детку блокируется и все остальное.

В общем человек хочет сделать также как в браузере модальное окошко яваскрипта, которое за пределы браузера не выползает.

Мне кажется, что вместо реального использования модальности тут можно тупо создать прозрачное окно поверх всего остального и на него поместить свой виджет. В результате нижние окна будут как бы блокированы (правда с фокусом и навигацией TABом могут быть косяки).