ui detect mouse event on objects
-
[WIN10] [MVS2019] [QtV6.3.1]
Hi,
in my code I got a lot of checkboxes.
QCheckBox *IO_1; QCheckBox *IO_2; QCheckBox *IO_3; ... ... QCheckBox *IO_46; QCheckBox *IO_47; QCheckBox *IO_48;
To check them by code I use a simple loop and select the checkboxes by searching for the object pointer by object name.
for (int i = 0; i < 48; i++) { QString cbName = "IO_"; cbName.append(QString::number(i + 1)); QCheckBox* cb = ui->SITIPEMaster->findChild<QCheckBox*>(cbName); cb->setChecked(sitipe_master.ptm.id[id].io[i].value); }
instead of setting each cb separately...
ui->IO_1->setChecked(sitipe_master.ptm.id[id].io[0].value); ui->IO_2->setChecked(sitipe_master.ptm.id[id].io[1].value); ui->IO_3->setChecked(sitipe_master.ptm.id[id].io[2].value); ui->IO_4->setChecked(sitipe_master.ptm.id[id].io[3].value); ui->IO_5->setChecked(sitipe_master.ptm.id[id].io[4].value); ... ...
that works fine....
now I want to detect a a cklick event on one of these checkboxes in a easy way.
I don´t want to check them alle in a own function/event...void on_IO_1_clicked(); void on_IO_2_clicked(); void on_IO_3_clicked(); void on_IO_4_clicked(); void on_IO_5_clicked(); ... ...
I tryed it with :
protected: void mousePressEvent(QMouseEvent* event); -------------- void MainWindow::mousePressEvent(QMouseEvent* event) { QWidget* const widget = childAt(event->pos()); qDebug() << "child widget" << widget; }
I got the following error:
"childAt(event->pos());"
ebent, type of pointer not alowed...What is the correct way to detect mouse event on objects?
-
for (int i = 0; i < 48; i++) { QString cbName = "IO_"; cbName.append(QString::number(i + 1)); QCheckBox* cb = ui->SITIPEMaster->findChild<QCheckBox*>(cbName); cb->setChecked(sitipe_master.ptm.id[id].io[i].value); // you can use toggled() or clicked() connect(cb, &QCheckBox::toggled, cb, [id, i](bool checked)) { // here you have 'i' }); }
-
// you can use toggled() or clicked() connect(cb, &QCheckBox::toggled, cb, [id, i](bool checked)) { // here you have 'i'
what exactly happend here?
you connect the checkbox toggled/clicked event to ???
Where can I catch this event for further use? -
@Pfanne
It's a C++ lambda, like an "anonymous function". Search forlambda
on https://wiki.qt.io/New_Signal_Slot_Syntax. @mpergand uses it here to pass thei
value from thefor
loop for you to use in the lambda code, which identifies which checkbox has been toggled. -
I take a look at QButtonGroup, this look like the right object for my usecase.
I tryed this:*.h
private slots: void on_ioGroup_clicked(int id);
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QButtonGroup* ioGroup = new QButtonGroup(this); ioGroup->addButton(ui->IO_1, 1; ioGroup->addButton(ui->IO_2, 2); connect(ioGroup, SIGNAL(buttonClicked(int)), this, SLOT(on_ioGroup_clicked(int))); } ---- void MainWindow::on_ioGroup_clicked(int id) { qDebug() << "id clicked" << id; } ``` but "on_ioGroup-clicked" will not be executed by clicking on IO_1 or IO_2.
-
yes, I also saw that "buttonClicked(int)" is not up to date!
this worked:
connect(ioGroup, &QButtonGroup::idClicked, this, MainWindow::on_ioGroup_clicked);
this not:
connect(ioGroup, &QButtonGroup::idClicked(int id), this, MainWindow::on_ioGroup_clicked(int id));
-
finaly this worked:
connect(ioGroup, SIGNAL(idClicked(int)), this, SLOT(on_ioGroup_clicked(int)));
void MainWindow::on_ioGroup_clicked(int id) { qDebug() << "id clicked" << id; QAbstractButton* cb = ioGroup->button(id); qDebug() << "Object" << cb->objectName(); }
-
@Pfanne said in ui detect mouse event on objects:
this worked:
connect(ioGroup, &QButtonGroup::idClicked, this, MainWindow::on_ioGroup_clicked);
Correct.
finaly this worked:
connect(ioGroup, SIGNAL(idClicked(int)), this, SLOT(on_ioGroup_clicked(int)));
Since you had it correct first why change it?
-
@mpergand said in ui detect mouse event on objects:
How to set text color as you do in red in your posts ?
Interesting. I don't know and have never set a text color in any of my posts! :) @Pl45m4 post above with red text for
Text
is the first time I have seen any color.Oh, hang on! Like
buttonClicked()
? LMAO, until today's forum update that was in green, no wonder I didn't know about red! The "color" is just up to the forum style. The important thing is that code is inmonospace
font. Use the Code icon (</>
) when you are typing in. Or`in-line codecharacters`
```
multiline code multiline code
```
First one is single-backtick inline, second one is triple-backtick above and below block. -
-
@JonB said in ui detect mouse event on objects:
Interesting. I don't know and have never set a text color in any of my posts! :) @Pl45m4 post above with red text for Text is the first time I have seen any color.
I use this text format every time I mention some Qt term or class.
QPushButton
,QObject
,Q_OBJECT
.
So did/do you ;-)
I don't know what exactly you did when writing these posts, but I used single backticks (don't know how they are called)
` QPushButton ` (now escaped to make them visible)LMAO, until today's forum update that was in green, no wonder I didn't know about red
I could swear it was red before, with some kind of red-ish background.
At least when used outside of a code section in regular paragraphs.