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



  • a little weird but you can just calculate yourself if the dragging button is above another one with simple rectangle collisions and then call the click slot of the button?



  • 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.



  • I think the mouse pos might be in global coordinates, but the button pos relative to the parent.
    Try and print the positions to the console...



  • 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")
    @


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.