2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18

Имитация нажатия левой кнопки мыши

28.07.2012, 20:01. Показов 14119. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите, как в Qt сгенерировать событие нажатия левой кнопки мыши?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.07.2012, 20:01
Ответы с готовыми решениями:

Эмуляция нажатия левой кнопки мыши на QWebView (ui->webView)
QCursor::setPos(60,320); QMouseEvent mouseEvent(QEvent::MouseButtonPress,QCursor ::...

Обработка нажатия кнопки мыши
Друзья, нужна ваша помощь. Переопределил virtual void mousePressEvent(QMouseEvent *even); И считываю координаты нажатия. И координаты мне...

Обработка нажатия кнопки мыши
Друзья, начал разбираться с qt, нужна ваша помощь. Хочу обработать нажатие левой кнопки мыши на объект qgraphicsview. Проблема в написании...

26
Почетный модератор
 Аватар для Humanoid
11542 / 4337 / 451
Регистрация: 12.06.2008
Сообщений: 12,445
28.07.2012, 20:19
Если внутри своего окна, то, на мой взгляд, проще нужный слот вызвать. А если снаружи, то, скорее всего, придётся средствами ОС пользоваться. Например, в виндовсе это можно сделать примерно так
Code
1
2
3
  SetCursorPos(X,Y);
  mouse_event(MOUSEEVENTF_LEFTDOWN,X,Y,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,X,Y,0,0);
(этот пример я делал в делфи, поэтому может чуть-чуть подправить придётся для Си)
1
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
28.07.2012, 20:41  [ТС]
В том то и дело, что нужно снаружи вызывать нажатия. Пробую читать документацию, с английским у меня хоть и не очень, но вроде все понятно и переводимо, а нужного найти не могу. Понял только, как координаты устанавливать. Мне нужно, чтобы курсор в разных местах появлялся и производил нажатия в браузере

C++
1
2
3
SetCursorPos(X,Y);
  mouse_event(MOUSEEVENTF_LEFTDOWN,X,Y,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,X,Y,0,0);
А это должно работать в Qt Creatore? Прям так код и вводить или нужно еще какую-то поддержку WinApi реализовать?
0
Прогер
 Аватар для Programmer.
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
28.07.2012, 21:43
Максим1,
Честно говоря надо(можно) переопределить функцию:
C++ (Qt)
1
void mousePressEvent(QMouseEvent *e);
и повазится потом с етим...
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
31.07.2012, 15:31  [ТС]
C++
1
2
3
SetCursorPos(X,Y);
  mouse_event(MOUSEEVENTF_LEFTDOWN,X,Y,0,0);
  mouse_event(MOUSEEVENTF_LEFTUP,X,Y,0,0);
Это исправно работает в Visual C++. Хорошо, но хотелось бы ту же функцию реализовать на Qt, в Qt Creatore пробовал ввести этот код, подключил windows.h, пишет, что найден неразрешенный элемент. Вообще насколько уместно/возможно применение WinAPI при работе с Qt? Если мне какие-то функции понадобятся из Win, как я их могу подключить в Qt?

В идеале, конечно, надо бы в Qt эту проблему разрешить средствами Qt, а не WinAPI. Сейчас разбираюсь с методами QMouseEvent
0
Почетный модератор
 Аватар для Humanoid
11542 / 4337 / 451
Регистрация: 12.06.2008
Сообщений: 12,445
31.07.2012, 15:39
Цитата Сообщение от Максим1 Посмотреть сообщение
Хорошо, но хотелось бы ту же функцию реализовать на Qt, в Qt Creatore пробовал ввести этот код, подключил windows.h, пишет, что найден неразрешенный элемент.
У меня нормально сработало. Ты учёл, что X и Y - это переменные, которые надо объявить вначале.
Цитата Сообщение от Максим1 Посмотреть сообщение
Вообще насколько уместно/возможно применение WinAPI при работе с Qt?
Вполне уместно, но теряется кросплатформенность.
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
31.07.2012, 15:49  [ТС]
Humanoid

Я ввел вместо X и Y цифры, как делал в студии, не работает.
Попробовал сейчас через переменные, то же самое
0
Эксперт С++
 Аватар для Maxim Prishchepa
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.07.2012, 15:58
эмм.... гуглобан получили однако?
жмак
0
Почетный модератор
 Аватар для Humanoid
11542 / 4337 / 451
Регистрация: 12.06.2008
Сообщений: 12,445
31.07.2012, 16:01
Я в конструкторе окна выполнил такое:
C++ (Qt)
1
2
3
SetCursorPos(10,10);
mouse_event(MOUSEEVENTF_LEFTDOWN,10,10,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,10,10,0,0);
В результате он, как и положено, нажал на заголовок окна самого QtCreator'а, который находился на этих координатах и появилось его меню.
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
31.07.2012, 19:18  [ТС]
Humanoid

Может есть какие-то моменты, мне неизвестные, вы не могли бы показать исходник? Может увижу что-то нужное и узнаю, что делаю не так. Я правильно понял, что достаточно включить windows.h и функцию можно свободно использовать?
0
Почетный модератор
 Аватар для Humanoid
11542 / 4337 / 451
Регистрация: 12.06.2008
Сообщений: 12,445
31.07.2012, 19:58
Максим1, да, достаточно создать пустой gui проект и просто добавить эти функции:
файл *.pro
Code
1
2
3
4
5
6
7
8
9
10
11
12
QT       += core gui
 
TARGET = test-form3
TEMPLATE = app
 
 
SOURCES += main.cpp\
           mainwindow.cpp
 
HEADERS  += mainwindow.h
 
FORMS    += mainwindow.ui
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QtGui/QApplication>
#include <QTextCodec>
#include "mainwindow.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));
    MainWindow w;
    w.show();
 
    return a.exec();
}
mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
    class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
 
private:
    Ui::MainWindow *ui;
 
private slots:
};
 
#endif // MAINWINDOW_H
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <windows.h>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    SetCursorPos(10,10);
    mouse_event(MOUSEEVENTF_LEFTDOWN,10,10,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,10,10,0,0);
}
Я не понимаю, в чём у тебя проблема. Всё предельно просто.
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
31.07.2012, 21:05  [ТС]
Пока ничего не выходит, везде выдает "ссылка на неразрешенный внешний символ SetCursorPos..."
Проблема, видимо, с линкером, гугл говорит, что такие ошибки связаны с тем, что линкер не может найти подключаемые библиотеки и надо как-то вручную их подключить.
0
Почетный модератор
 Аватар для Humanoid
11542 / 4337 / 451
Регистрация: 12.06.2008
Сообщений: 12,445
31.07.2012, 21:14
Попробуй добавить в файл .pro
Code
1
LIBS += -luser32
1
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
31.07.2012, 21:27  [ТС]
Не помогло

Извиняюсь, забыл пересобрать проект(иногда почему-то приходиться пересобирать или старый дебаг удалять), теперь все работает после добавления LIBS += -luser32
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
02.08.2012, 02:15  [ТС]
Попробовал имитировать клик, программа запускается, но клика и установки курсора не происходит. Вот кусок кода:

C++ (Qt)
1
2
const QPoint P(100,100);
QMouseEvent* pe = new QMouseEvent(QEvent::MouseButtonPress,P,Qt::LeftButton,Qt::NoButton, Qt::NoModifier);
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
06.08.2012, 15:33
Событие необходимо отправить при помощи функции
C++ (Qt)
1
bool QCoreApplication::sendEvent ( QObject * receiver, QEvent * event ) [static]
Как видно, это будет работать только внутри приложения
0
2 / 2 / 1
Регистрация: 08.05.2012
Сообщений: 18
07.08.2012, 01:19  [ТС]
Kojt
Я так и делал, не работает. Вот код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLineEdit txt("Hi");
 
    txt.show();
    txt.move(100,50);
 
    
    const QPoint p(280,60);
        
    QMouseEvent* pe = new QMouseEvent(QEvent::MouseButtonPress,p,Qt::LeftButton,Qt::NoButton, Qt::NoModifier);
    QApplication::sendEvent(&txt, pe);
 
    return app.exec();
}
Вот с имитированием клавиши "А" в схожем коде все работает:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLineEdit txt("Hi");
 
    txt.show();
    txt.move(100,50); 
 
    QChar ch = 65;
 
    QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,41,Qt::NoModifier,ch);
    
    QApplication::sendEvent(&txt, pe);
 
    return app.exec();
}
Наверное, проблема где-то здесь:
C++ (Qt)
1
QMouseEvent* pe = new QMouseEvent(QEvent::MouseButtonPress,p,Qt::LeftButton,Qt::NoButton, Qt::NoModifier);
Это действительно должно работать только в пределах виджета, но для начала хотелось бы хоть так сделать
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
07.08.2012, 07:46
Нужно указывать локальные координаты виджета, которому отправляется событие от мыши.
Например:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLineEdit txt("Hi");
 
    txt.show();
    txt.move(100,50);
 
    
    const QPoint p(10,10);
        
    QMouseEvent* pe = new QMouseEvent(QEvent::MouseButtonPress,p,Qt::LeftButton,Qt::NoButton, Qt::NoModifier);
    QApplication::sendEvent(&txt, pe);
 
    return app.exec();
}
Можно еще попробовать отправлять следом событие
C++ (Qt)
1
QEvent::MouseButtonRelease
0
1 / 1 / 1
Регистрация: 07.08.2012
Сообщений: 30
07.08.2012, 12:03
Помогите разобраться, не работает код.

компилятор ругается на эти ошибки:

C++ (Qt)
1
2
3
4
5
 
‘SetCursorPos’ was not declared in this scope
‘MOUSEEVENTF_LEFTDOWN’ was not declared in this scope
‘mouse_event’ was not declared in this scope
‘MOUSEEVENTF_LEFTUP’ was not declared in this scope
Делал по примеру Humanoid'a
0
73 / 69 / 1
Регистрация: 19.05.2010
Сообщений: 167
07.08.2012, 12:05
Скорее всего не хватает
#include <windows.h>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2012, 12:05
Помогаю со студенческими работами здесь

wxWidgest: привязка эвента нажатия кнопки мыши к wxStaticText
Незнаю как привязать событие нажатия кнопки мыши к статическому тексту. st_text = new wxStaticText(panel, STT_ID, L&quot;Press on...

QML обработка события нажатия кнопки мыши
Собственно. Есть вот такой вот main.qml: import QtQuick 1.1 Rectangle { id: rectangle2 width: 360 height: 360

Имитация нажатия левой кнопки мыши
Нужна имитация нажатия левой кнопки мыши только для конкретного окна/программы, то есть не это: ...

Имитация нажатия левой и правой кнопки мыши
Тут на форуме просто свалка из таких тем, и везде мегаметоды для этого писать надо, Подскажите команду пожалуйста как иммитировать нажатие...

Имитация клика левой кнопки мыши
здравствуйте. хочу сделать автокликер, который работает по следующему принципу - нажимаю например F2 и он запускается. я открываю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Система статов в Unity
GameUnited 20.04.2025
Статы — фундаментальный элемент игрового дизайна, который определяет характеристики персонажей, предметов и других объектов в игровом мире. Будь то показатель силы в RPG, скорость передвижения в. . .
Статические свойства и методы в TypeScript
run.dev 20.04.2025
TypeScript прочно занял своё место в системе современной веб-разработки. Этот строго типизированный язык программирования не просто расширяет возможности JavaScript — он делает разработку более. . .
Batch Transform и Batch Gizmo Drawing API в Unity
GameUnited 20.04.2025
В мире разработки игр и приложений на Unity производительность всегда была критическим фактором успеха. Создатели игр постоянно балансируют между визуальной привлекательностью и плавностью работы. . .
Звук в Unity: Рандомизация с Audio Random Container
GameUnited 20.04.2025
В современных играх звуковое оформление часто становится элементом, который либо полностью погружает игрока в виртуальный мир, либо разрушает атмосферу за считанные минуты. Представьте: вы исследуете. . .
Максимальная производительность C#: Советы, тестирование и заключение
stackOverflow 20.04.2025
Погружение в мир микрооптимизаций C# открывает перед разработчиком целый арсенал мощных техник. Но как определить, где и когда их применять? Ответ начинается с точных измерений и профилирования. . . .
Максимальная производительность C#: Предсказание ветвлений
stackOverflow 20.04.2025
Третий ключевой аспект низкоуровневой оптимизации — предсказание ветвлений. Эта тема менее известна среди разработчиков, но её влияние на производительность может быть колоссальным. Чтобы понять. . .
Максимальная производительность C#: Векторизация (SIMD)
stackOverflow 20.04.2025
Помимо работы с кэшем, другим ключевым аспектом низкоуровневой оптимизации является векторизация вычислений. SIMD (Single Instruction, Multiple Data) позволяет обрабатывать несколько элементов данных. . .
Максимальная производительность C#: Процессорный кэш
stackOverflow 20.04.2025
Знакомство с внутренним устройством процессорного кэша — ключевой шаг в написании по-настоящему быстрого кода на C#. Этот слой архитектуры компьютера часто ускользает от внимания разработчиков, но. . .
Максимальная производительность C#: Введение в микрооптимизации
stackOverflow 20.04.2025
В мире разработки на C# многие привыкли полагаться на . NET Runtime, который "магическим образом" сам оптимизирует код. И часто это работает - современные JIT-компиляторы творят чудеса. Но когда речь. . .
MVC фреймворк в PHP
Jason-Webb 19.04.2025
Архитектурный паттерн Model-View-Controller (MVC) – это не просто модный термин из мира веб-разработки. Для PHP-программистов это фундаментальный подход к организации кода, который радикально меняет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru