문제

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

도움이 되었습니까?

해결책

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

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top