Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Anatolym78 от Январь 18, 2011, 15:26



Название: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 18, 2011, 15:26
Есть набор вложенных виджетов, созданный в дизайнере. Frame->Frame->Widget. Последний связан с классом, производным от QWidget и содержит обработчики сообщений. Но почему-то сообщения от мыши в этот объект этого класса не приходят. В то время, как, например, сообщения QPaintEvent или QResizeEvent приходят. Может кто-то сталкивался с такой проблемой, помогите разобраться.


Название: Re: Не приходят сообщения от мыши
Отправлено: alexman от Январь 18, 2011, 16:10
void   setMouseTracking ( bool enable )


Название: Re: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 18, 2011, 16:17
setMouseTracking необходим для того, чтобы приходило сообщение о перемещении мыши при не нажатых кнопках мыши. У меня вообще никакие сообщения от мыши не приходят.


Название: Re: Не приходят сообщения от мыши
Отправлено: Karl-Philipp от Январь 18, 2011, 16:23
А какие сообщения вы хотите получить?
Может быть воспользоваться сигналами, например, clicked()?


Название: Re: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 18, 2011, 16:28
Обычные, mousePressEvent, mouseMoveEvent и т. д.


Название: Re: Не приходят сообщения от мыши
Отправлено: GreatSnake от Январь 18, 2011, 16:58
Показывай код.


Название: Re: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 18, 2011, 17:56
widget = new QWidget(m_mainSplitter);
frame = new QFrame(widget);
m_leftView3D = new SceneView(frame);
SceneView производный от QWidget и является promoted widget'ом.
Сам класс SceneView

class SceneView : public QWidget
{
   Q_OBJECT

public:
   SceneView(QWidget *parent = 0);
   ~SceneView();
   void paintEvent(QPaintEvent*);
   void mousePressEvent(QMouseEvent* e);
   void mouseMoveEvent(QMouseEvent* e);
   void resizeEvent(QResizeEvent* e);

private:
   //Ui::SceneView ui;
};


SceneView::SceneView(QWidget *parent)
   : QWidget(parent)
{
   //ui.setupUi(this);
}

SceneView::~SceneView()
{
}

void SceneView::paintEvent(QPaintEvent*)
{
}

void SceneView::mousePressEvent(QMouseEvent* e)
{
}

void SceneView::mouseMoveEvent(QMouseEvent* e)
{

}

void SceneView::resizeEvent(QResizeEvent* e)
{

}

Я правда опустил код с созданием лайоутов.
Так вот, сообщения от мыши не приходят. Если убрать раскомментировать то, что закомментировано, ничего не изменится.
При добавлении этого виджета в другом месте все работает


Название: Re: Не приходят сообщения от мыши
Отправлено: GreatSnake от Январь 19, 2011, 08:54
Цитировать
При добавлении этого виджета в другом месте все работает
Ну значит в данном случае этот виджет не получает эти события.


Название: Re: Не приходят сообщения от мыши
Отправлено: Ubuntu_linux от Январь 20, 2011, 14:24
Код
C++ (Qt)
public  slots:
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);
void resizeEvent(QResizeEvent* e);


Название: Re: Не приходят сообщения от мыши
Отправлено: p166 от Январь 20, 2011, 14:53
Код:
protected:
    void mousePressEvent(QMouseEvent *event);

и все работает.


Название: Re: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 21, 2011, 16:00
public slots:
что то я этого не понял, разве есть у виджета есть такие сигналы, чтобы к ним можно было законнектиться.
protected проблемы не решает естественно.

Проблема в том, что сообщение почему-то не приходит виджету когда он расположен таким образом как я описывал. Когда я этот виджет кладу в другое место, то сообщения приходят, вот тут и загадка.


Название: Re: Не приходят сообщения от мыши
Отправлено: Ubuntu_linux от Январь 21, 2011, 18:31
Сигнал нажатия мыши, ..... и он вызывает соответствующий слот.


Название: Re: Не приходят сообщения от мыши
Отправлено: shirushizo от Январь 21, 2011, 18:45
У меня была похожая проблема: QDialog на нем QStackedWidget, на нем QScrollArea, на нем QLabel c QPixmap... событие нажатия, отпускания, двойного щелчка получал QDialog, т.е. виджет верхнего уровня, пришлось через методы QWidget::pos() и QWidget::size() вычислять интервал и проверять попадание QMouseEvent::pos().

Наверно, поэтому -
...
При добавлении этого виджета в другом месте все работает

Код
C++ (Qt)
public  slots:
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);
void resizeEvent(QResizeEvent* e);
??? А это что за жесть? можно подробнее ?

Реквестирую топик, может есть нормальное решение?


Название: Re: Не приходят сообщения от мыши
Отправлено: Anatolym78 от Январь 21, 2011, 18:54
Оказалось сообщение приходит родительскому фрейму, а дальше к дочерним виджетам не идет.
У меня был слоеный пирог из нескольких вложенных виджетов. Причем некоторые из них были promoted.
Сделал тупо все нафиг удалил и начал заново шаг за шагом собирать то что было, проверяя на каждом шаге приходит ли сообщение. В результате такой пересборки в дизайнере, сообщение к нужному виджету стало приходить. Хрен его теперь поймет что там было, собрал все также. Вроде бы :)