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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как реализовать событие наведение курсора мыши при нажатой левой кнопки?  (Прочитано 7860 раз)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« : Сентябрь 08, 2015, 09:57 »

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Сентябрь 08, 2015, 10:23 »

Посмотрите QWidget::enterEvent
Записан

billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #2 : Сентябрь 08, 2015, 10:26 »

Посмотрите QWidget::enterEvent
спасибо, сейчас глянем.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 08, 2015, 10:29 »

Неправильный совет, ибо при нажатии на кнопку на одном виджете будет сделан пассивный граб мыши и к другим виджетам события приходить не будут.

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
« Последнее редактирование: Сентябрь 08, 2015, 10:50 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Сентябрь 08, 2015, 10:55 »

Кстати, используя QListView/QListWidget можно слепить подобный функционал намного быстрее и проще.
Записан

Qt 5.11/4.8.7 (X11/Win)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #5 : Сентябрь 08, 2015, 11:05 »

QWidget::enterEvent не помог. GreatSnake, сейчас попробую реализовать то, что Вы посоветовали.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 08, 2015, 12:19 »

Удобнее навесить фильтр на QWindow, туда железно все придет. Тогда можно все сделать в этом фильтре. Правда вешать его надо аккуратно, окно должно быть уже создано
Записан
Bepec
Гость
« Ответ #7 : Сентябрь 08, 2015, 19:32 »

Решения нет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 09, 2015, 08:47 »

Решения нет?
Пока объяснишь - проще пример сделать
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #9 : Сентябрь 09, 2015, 08:58 »

Решения нет?


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

Сообщений: 306


Просмотр профиля
« Ответ #10 : Сентябрь 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;");
  }
}
Но это не помогло. Может при зажиме левой клавиши мыши, событие не завершается пока не отожмешь ее? И поэтому не срабатывает движение при зажатой кнопки мыши.
Записан
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #11 : Сентябрь 09, 2015, 09:07 »

Решения нет?
Пока объяснишь - проще пример сделать

Igors, спасибо за пример. Вы меня не совсем правильно поняли. На первом рисунке это я просто попытался отобразить последовательность действий и результатов.
У меня виджет с одной лентой Label-ов. Но Ваш пример мне может помочь. Сейчас буду разбираться.
« Последнее редактирование: Сентябрь 09, 2015, 09:17 от billy4685 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Сентябрь 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();
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
billy4685
Крякер
****
Offline Offline

Сообщений: 306


Просмотр профиля
« Ответ #13 : Сентябрь 09, 2015, 12:01 »

А чем не подошел QListWidget?
........

Пока просто не пробовал даже реализовать это через QListWidget.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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