PDA

View Full Version : Qtest does not emit signal



NIK-VAJ
17th February 2016, 19:24
I want to simulate mouse click in a application. I use QT::mouseclick and QT::mousemove to click in different positions. when I run code, position of my pushbutton was clicked but the related SLOT doesn't run. Doesn't QTest emit signal? How do I simulate mouse click with signal?

anda_skoa
18th February 2016, 09:15
QTest is a namespace and doesn't have any signals.

If a widget has a signal and you provide the input it needs to emit it, then it will do so. It doesn't know whether it is in an application or running in a test.

So if you don't get a slot called, then there is either a problem with the signal/slot connection, in which case you can try QSignalSpy to verify this, or the widget has not received the events that it needs to trigger the emit, in which case you either have to debug how the correct event sequence is or find another way to trigger, e.g. in case of a button QAbstractButton::click().

Cheers,
_

NIK-VAJ
18th February 2016, 13:40
thanks. I try click() and it was OK but could I find a way that doesn't need the name of pushbuttons or other elements? I want to use only x and y position to simulate fake click and get signal of events.

anda_skoa
18th February 2016, 14:07
When you used the QTest::mouseClick() method, did you use the one taking a QWidget or the one taking a QWindow?

Cheers,
_

NIK-VAJ
18th February 2016, 14:17
I use this code:

QTest::mouseMove(this,mapToGlobal(QPoint(x,y)));
QTest::mouseClick(this, Qt::LeftButton,0, mapToGlobal(QPoint(x,y)),-1);

"this" is mainwindow. my code shoud be independent of name of widgets like pushbutton.

anda_skoa
18th February 2016, 15:10
mapToGlobal doesn't make much sense unless you have ensured that the windows is positioned at 0,0 and thus global/local coordinates being the same.

In either case, you likely need the overload that takes a QWindow, the one that takes a QWidget delivers mouse event to that specific widget.

Cheers,
_

NIK-VAJ
18th February 2016, 16:03
thanks for your quick replies
even when I use qwidget in mousclick function, it doesn't emit a signal!

anda_skoa
18th February 2016, 16:12
thanks for your quick replies
even when I use qwidget in mousclick function, it doesn't emit a signal!

So you changed the code to send the clicks to the button and it does not emit the signal?
Can you show the code you have now?

Cheers,
_

NIK-VAJ
18th February 2016, 16:40
if (event->button()==Qt::RightButton){
qDebug() << Qt::RightButton << pos();
QPoint Mpush = pos();
QTest::mouseMove(this->m_button,Mpush);
QTest::mouseClick(this->m_button, Qt::LeftButton,0,Mpush,-1);}
in this code, when I Rightclicked on button, the position of cursor places in Mpush and then lift click is simulated. it doesn't emit pushbutton(m_button) signal.

anda_skoa
18th February 2016, 16:56
So you are trying to simulate a mouse click on "m_button", at x=751, y=327 in "m_button".

Are you certain that the button is really that large?

Is it important for your button where it is clicked?
If not you could just omit the position and it gets clicked in its center.

Cheers,
_

NIK-VAJ
18th February 2016, 17:17
pos() is not position of cursor in the screen?
and how can I find center of poshbutton?

anda_skoa
18th February 2016, 17:21
pos() is not position of cursor in the screen?

Well, I assume that "this" in your code is a QWidget derived class, which makes pos() most likely this function: QWidget::pos().

Of course if "this" is a class of your own and you have implemented a pos() function that returns the cursor on screen, than that is what it will return.
In that case you need to make sure to map it to the button's coordinate system.



and how can I find center of poshbutton?

button->rect().center(), but why do you need that?

Cheers,
_

NIK-VAJ
18th February 2016, 17:31
I use this line of code and it emits signal :)
QTest::mouseClick(this->m_button, Qt::LeftButton,0,m_button->rect().center(),-1);

anda_skoa
18th February 2016, 17:38
Clicking the center is the default behavior if you don't specify a position, so you could just call



QTest::mouseClick(this->m_button, Qt::LeftButton);


Cheers,
_

NIK-VAJ
18th February 2016, 17:48
I have another question. which function give me position of a widget in main window?

anda_skoa
18th February 2016, 17:59
pos() gives you the position relative to its parent.
The parent's mapToGlobal() can map that to a global positon, the main window's mapFromGlobal can turn that into a position within main window.

Cheers,
_

NIK-VAJ
18th February 2016, 18:17
thank you very much:)