Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Сентябрь 08, 2015, 09:57



Название: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 08, 2015, 09:57
Здравствуйте, господа форумчане. Появилась необходимость закрашивать лейблы (QLabel)  при наведении на них курсора мыши с нажатой левой клавишей мыши. 
Вчера пол дня пропарился, никак не выходит это событие правильно описать. Получилось только реализовать клик левой клавиши мыши с движением курсора мыши на
самом Label-е, но это мне не подходит, так как при перетягивании курсора с удерживанием левой клавиши мыши на второй Label событие уже не будет срабатывать.
В моем случаи левая клавиша мыши должна быть нажата на родительском виджете (или на первом Labele), и при перетягивании курсора мыши на другой Label с удержаной
левой клавишей мыши, все предыдущие Label-ы и текущий должны быть закрашены другим цветом. Для лучшей наглядности ниже прикрепляю рисунок.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: gil9red от Сентябрь 08, 2015, 10:23
Посмотрите QWidget::enterEvent (http://doc.qt.io/qt-4.8/qwidget.html#enterEvent)


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 08, 2015, 10:26
Посмотрите QWidget::enterEvent (http://doc.qt.io/qt-4.8/qwidget.html#enterEvent)
спасибо, сейчас глянем.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: GreatSnake от Сентябрь 08, 2015, 10:29
Посмотрите http://doc.qt.io/qt-4.8/qwidget.html#enterEvent (http://doc.qt.io/qt-4.8/qwidget.html#enterEvent)
Неправильный совет, ибо при нажатии на кнопку на одном виджете будет сделан пассивный граб мыши и к другим виджетам события приходить не будут.

2 billy4685:
На форме, на которой заводятся QLabel перегрузи
Код
C++ (Qt)
bool QObject::eventFilter(QObject * watched, QEvent * event) [virtual]
и уже там отлавливай все события.
Не забудь через
Код
C++ (Qt)
void QObject::installEventFilter(QObject * filterObj)
добавить для фильтровки все QLabel.

Update.
Хм..., есть подозрение, что так тоже не получится.

Попробуй так:
1. В QLabel перегрузи
Код
C++ (Qt)
void mousePressEvent(QMouseEvent * event)
в которой игнорируй нажатие мыши через
Код
C++ (Qt)
event->ignore();
2. В форме включи
Код
C++ (Qt)
setMouseTracking( true );
3. В ней же перегрузи
Код
C++ (Qt)
void mousePressEvent(QMouseEvent * event)
void mouseMoveEvent(QMouseEvent * event)
void mouseReleaseEvent(QMouseEvent * event)
и в них следи за соответствующим QLabel


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: GreatSnake от Сентябрь 08, 2015, 10:55
Кстати, используя QListView/QListWidget можно слепить подобный функционал намного быстрее и проще.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 08, 2015, 11:05
QWidget::enterEvent не помог. GreatSnake, сейчас попробую реализовать то, что Вы посоветовали.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: Igors от Сентябрь 08, 2015, 12:19
Удобнее навесить фильтр на QWindow, туда железно все придет. Тогда можно все сделать в этом фильтре. Правда вешать его надо аккуратно, окно должно быть уже создано


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: Bepec от Сентябрь 08, 2015, 19:32
Решения нет?


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: Igors от Сентябрь 09, 2015, 08:47
Решения нет?
Пока объяснишь - проще пример сделать


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 09, 2015, 08:58
Решения нет?


Нет пока так и не вышло. Получается закрашивать Label-ы при клике или при движении.
Решил все же использовать eventFilter(QObject *obj, QEvent *ev) и уже в нем для Label-ов проверяю события нажатия и движения.
Прикрепляю файлы, так как архив что-то не хочет отправляться.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 09, 2015, 09:04
Пытался в том примере что отправил изменить следующим образом код:
Код:
bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
  for(int i=0; i<N; i++)
  {
  if(obj == label[i])
  {
  if(ev->type() == QEvent::MouseButtonPress)
  {
QMouseEvent *mouseev = static_cast<QMouseEvent*>(ev);
if(mouseev->button() == Qt::LeftButton)
{
  count_click = i+1;
  click_flag = true;
  setStyleS();
}
else
  click_flag = false;
  }
  if(ev->type() == QEvent::MouseButtonRelease)
  {
click_flag = false;
  }
  if(ev->type() == QEvent::Enter && click_flag == true)
  {
count_click = i+1;
setStyleS();
  }
  }
  }

  return QMainWindow::eventFilter(obj, ev);
}


void MainWindow::setStyleS()
{
  for(int i=0; i<N; i++)
  {
  if(count_click != 0 && (i+1) <= count_click)
  {
if(click_flag == true)
  label[i]->setStyleSheet("background-color: green;");
  }
  else
label[i]->setStyleSheet("background-color: cyan;");
  }
}
Но это не помогло. Может при зажиме левой клавиши мыши, событие не завершается пока не отожмешь ее? И поэтому не срабатывает движение при зажатой кнопки мыши.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 09, 2015, 09:07
Решения нет?
Пока объяснишь - проще пример сделать

Igors, спасибо за пример. Вы меня не совсем правильно поняли. На первом рисунке это я просто попытался отобразить последовательность действий и результатов.
У меня виджет с одной лентой Label-ов. Но Ваш пример мне может помочь. Сейчас буду разбираться.


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: GreatSnake от Сентябрь 09, 2015, 11:35
А чем не подошел QListWidget?

Код
C++ (Qt)
#include <QApplication>
#include <QListWidget>
 
int main( int argc, char** argv )
{
QApplication a( argc, argv );
 
QListWidget lw;
 
lw.setStyleSheet(
"QListView::item { background: lightGray; }\n"
"QListView::item:selected { background: green; }" );
 
for( int i = 0; i < 16; i++ )
{
lw.addItem( QString::number( i + 1 ) );
QListWidgetItem* item = lw.item( i );
item->setData( Qt::TextAlignmentRole, Qt::AlignCenter );
item->setSizeHint( QSize( 32, 32 ) );
}
 
lw.setSpacing( 4 );
lw.setWrapping( true );
lw.setFlow( QListView::LeftToRight );
lw.setResizeMode( QListView::Adjust );
lw.setUniformItemSizes( true );
lw.setSelectionMode( QAbstractItemView::ExtendedSelection /*QAbstractItemView::ContiguousSelection*/ );
 
lw.show();
 
return a.exec();
}
 


Название: Re: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?
Отправлено: billy4685 от Сентябрь 09, 2015, 12:01
А чем не подошел QListWidget?
........

Пока просто не пробовал даже реализовать это через QListWidget.