Push button while dragging mouse
-
Hello
Let say I have 5 qpushbuttons placed in one row. I can press them separatelty one by one, but what if I want to triger them while draging the mouse ? It looks like this: I press one button and while holding left button drag mouse to other buttons in the row and they sould react like I pressed them. How can i do that ?
Thank you !
Sorry for my english -
Thanks, but I don't move button by it selve.
For example each button changes color to yellow when it's clicked.
Now I press first button in the row and drag mouse cursor (not Pushbutton), to the right over other buttons and all of them changing collors yellow.I think I could calculate cursor posittion. but I dont know how ?
Sorry for my english.
-
yeah sorry for misunderstanding, if you just move the cursor and not the button that is the same, just easier! :)
You could override this method in the widget or layout where the buttons are:
@
QWidget::mouseMoveEvent(QMouseEvent * event)
@
and then you should get mouse move events when you press the button and move the mouse, just try it.
I don't think it will be hard to find out if the mouse is over another button for you? :) -
Thank you.
I just tested QMouseEvent and I don't know why but it's not working as I expected. My code:
@void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
if (ui->Button->rect().contains(event->pos()))
{
ui->Button->setText("YES");}
else{ui->Button->setText("NO");}
}@And I always get text "NO" no matter where cursor is, inside or outside of button.
EDIT
Looks like I am getting wrong position of cursor, or PushButton, Because I get text setted to "YES" when currsor is somwhere above button but not inside.
-
Thanks again.
Yes it was set to global coordinates, I fixed it like this:
@QRect widgetRect = ui->Btt_1->geometry();
widgetRect.moveTopLeft(ui->Btt_1->parentWidget()->mapToGlobal(widgetRect.topLeft()));
@
Now position is correct.I don't want to rewrite same thing for each button so I am trying to write function. But I can't pass QPushButton to the function. I am trying to do this:
@void MainWindow::mouseMoveEvent(QMouseEvent * event, QPushButton *btn)
{
QRect widgetRect = btn->geometry();
widgetRect.moveTopLeft(btn->parentWidget()->mapToGlobal(widgetRect.topLeft()));if (widgetRect.contains(QCursor::pos())){btn->clicked();}
}@
but when I call that function I am getting error.@mouseMoveEvent(ui->Button_1); //Error no matching function for call to 'MainWindow::mouseMoveEvent(QPushButton*&)'@
How can I pass PushButton corectly to function ?
Sory for my english.
-
you can't simply change the signature of the mouseMoveEvent function and add a parameter to it, then it won't work as you expect because QWidget won't call it and nothing happens.
I think you have multiple buttons you need to check? you could just do a for-loop in the mouseMoveEvent function to check all buttons and don't need an extra function then, but I don't know more about you app so it's hard to say what would be best in your case.
Where do you call "mouseMoveEvent(ui->Button_1);" in your code?
-
Sory I didn't got atime to reply.
Yes I have multiple buttons to check.
As far as I understund I can't loop UI element.@for (i = 1; i < ButtnCount; i++)
{
QRect widgetRect = ui->PUSHBUTTON_i->geometry();
widgetRect.moveTopLeft(ui->PUSHBUTTON_i->parentWidget()->mapToGlobal(widgetRect.topLeft()));if (widgetRect.contains(QCursor::pos())){ui->PUSHBUTTON_i->clicked();
}@
I know I can write a QVector:
@
QVector <QPushButton*> ButtonVector;
ButtonVector.push_back (ui->PUSHBUTTON_1);
ButtonVector.push_back (ui->PUSHBUTTON_2);
ButtonVector.push_back (ui->PUSHBUTTON_3);
...................
@
And it's ok for this example, where I have 5 buttons, but what if I have more then that like 200 or so, then I have to write every button in QVector.My program works like thsis each button can have two statets - marked (RED) and unmarked (GREEN):
@void MainWindow::on_PUSHBUTTON_1_clicked()
{
if (PUSHBUTTON_1->stylesheet = "Code for RED color"){
ui->PUSHBUTTON_1->setstylesheet = "Code for GREEN color";
else ui->PUSHBUTTON_1->setstylesheet = "Code for RED color";}
}@
I repeated it for all 5 buttons. By the way is there a way to avoid that ? can I find out if any of five buttons was pressed and wich ? and than do something.Then my program works ok, I can press button and it will change it state. But I want to have abilaty to do that not just clicking on button but draging a mouse over few buttons and changing it's state, lets call it "Paint select".
Sorry for my english
-
Hi, I guess you have all the buttons in a layout (QLayout)? then you can iterate though the layout items and get a list of all the button, without to manually add them to a list (or vector) or whatever.
If you only have buttons in that layout it is very easy, if you have other widgets as well you need a filter which is not that nice in c++ because you have to dynamically cast the item to see if it actually is a button or something else:
@
QLayout *layout = ui->yourButtonLayout;
for (int i = 0; i < layout->count(); ++i) {
QLayoutItem *layoutItem = layout->itemAt(i);
// check if layout widget is a button
QWidget widget = layoutItem->widget();
if (qobject_cast<QPushButton>(widget)) {
QRect widgetRect = widget->geometry();
// do your cursor stuff etc
}
}
@
there are other ways how you can get your button without adding them all by yourself, but that depends on the widgets and layouts you are using, I hope this gets you started at least. :)aso be careful you forgot a "=" in your if i think:
@
if (PUSHBUTTON_1->stylesheet = "Code for RED color")
@
that is an assignment and no comparison, you need to use
@
if (PUSHBUTTON_1->stylesheet == "Code for RED color")
@