Pregunta

Is there any way to detect if the user clicked on the label on a QCheckBox or not? If so, I want to execute something and the checkstate should not be changed .. to checked or unchecked.

So far I can not find any signals / ways for that ..

¿Fue útil?

Solución

Event filter is the answer.

First install event filter on a check box for which you want to change behavior (during construction):

ui->checkBox->installEventFilter(this);

and then reject mouse press event when mouse is over the label (note how label is localized in code):

bool MainWindow::eventFilter(QObject *o, QEvent *e)
{
    if (o==ui->checkBox) {
        QMouseEvent*mouseEvent = static_cast<QMouseEvent*>(e);
        if (e->type()==QEvent::MouseButtonPress &&
                mouseEvent->button()==Qt::LeftButton) {
            QStyleOptionButton option;
            option.initFrom(ui->checkBox);
            QRect rect = ui->checkBox->style()->subElementRect(QStyle::SE_CheckBoxContents, &option, ui->checkBox);
            if (rect.contains(mouseEvent->pos())) {
                // consume event
                return true;
            }
        }
        return false;
    }
    return QMainWindow::eventFilter(o,e);
}

I've test it on Qt 4.8.1 for Linux and it works as you want (mouse clicks on a label are ignored and on check box it toggles state of check box).

Otros consejos

QLabel doesn't have an accessible 'on click' method, however you can subclass QLabel and reimplement the mousePressEvent(QMousePress *ev) slot which will allow you to do click detection.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top