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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не приходят сообщения от мыши  (Прочитано 5679 раз)
Anatolym78
Гость
« : Январь 18, 2011, 15:26 »

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

void   setMouseTracking ( bool enable )
Записан
Anatolym78
Гость
« Ответ #2 : Январь 18, 2011, 16:17 »

setMouseTracking необходим для того, чтобы приходило сообщение о перемещении мыши при не нажатых кнопках мыши. У меня вообще никакие сообщения от мыши не приходят.
Записан
Karl-Philipp
Гость
« Ответ #3 : Январь 18, 2011, 16:23 »

А какие сообщения вы хотите получить?
Может быть воспользоваться сигналами, например, clicked()?
Записан
Anatolym78
Гость
« Ответ #4 : Январь 18, 2011, 16:28 »

Обычные, mousePressEvent, mouseMoveEvent и т. д.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Январь 18, 2011, 16:58 »

Показывай код.
Записан

Qt 5.11/4.8.7 (X11/Win)
Anatolym78
Гость
« Ответ #6 : Январь 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)
{

}

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

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Январь 19, 2011, 08:54 »

Цитировать
При добавлении этого виджета в другом месте все работает
Ну значит в данном случае этот виджет не получает эти события.
Записан

Qt 5.11/4.8.7 (X11/Win)
Ubuntu_linux
Гость
« Ответ #8 : Январь 20, 2011, 14:24 »

Код
C++ (Qt)
public  slots:
void mousePressEvent(QMouseEvent* e);
void mouseMoveEvent(QMouseEvent* e);
void resizeEvent(QResizeEvent* e);
« Последнее редактирование: Январь 20, 2011, 14:26 от Ubuntu_linux » Записан
p166
Гость
« Ответ #9 : Январь 20, 2011, 14:53 »

Код:
protected:
    void mousePressEvent(QMouseEvent *event);

и все работает.
Записан
Anatolym78
Гость
« Ответ #10 : Январь 21, 2011, 16:00 »

public slots:
что то я этого не понял, разве есть у виджета есть такие сигналы, чтобы к ним можно было законнектиться.
protected проблемы не решает естественно.

Проблема в том, что сообщение почему-то не приходит виджету когда он расположен таким образом как я описывал. Когда я этот виджет кладу в другое место, то сообщения приходят, вот тут и загадка.
Записан
Ubuntu_linux
Гость
« Ответ #11 : Январь 21, 2011, 18:31 »

Сигнал нажатия мыши, ..... и он вызывает соответствующий слот.
Записан
shirushizo
Гость
« Ответ #12 : Январь 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);
Непонимающий А это что за жесть? можно подробнее ?

Реквестирую топик, может есть нормальное решение?
Записан
Anatolym78
Гость
« Ответ #13 : Январь 21, 2011, 18:54 »

Оказалось сообщение приходит родительскому фрейму, а дальше к дочерним виджетам не идет.
У меня был слоеный пирог из нескольких вложенных виджетов. Причем некоторые из них были promoted.
Сделал тупо все нафиг удалил и начал заново шаг за шагом собирать то что было, проверяя на каждом шаге приходит ли сообщение. В результате такой пересборки в дизайнере, сообщение к нужному виджету стало приходить. Хрен его теперь поймет что там было, собрал все также. Вроде бы Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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