QCheckBox 如何检测标签的点击事件

4

有没有办法检测用户是否点击了 QCheckBox 上的标签?如果是,我想执行一些操作,并且勾选状态不应更改为已选或未选。

到目前为止,我找不到任何信号/方法来实现这一点。

2个回答

3

事件过滤器是解决方案。

首先,在构建时在要更改行为的复选框上安装事件过滤器:

ui->checkBox->installEventFilter(this);

当鼠标在标签上时,拒绝鼠标按下事件(请注意,标签在代码中是本地化的)。
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);
}

我已经在Linux上的Qt 4.8.1上测试过了,它可以按照您的要求工作(鼠标点击标签时会被忽略,而在复选框上则会切换复选框的状态)。


我不使用额外的 QLabel。 我使用来自 QCheckBox 的标签。 但是,我想要检测来自 QCheckBox 的文本点击事件。 - Niklas
那么,这些信号有什么问题呢:clicked(bool)pressed()released()?为什么你接受了子类化 QLabel 的答案(这表明你使用了单独的 QLabel)? - Marek R
原因:我想执行某些操作,但是状态不应该被更改为选中或未选中,但这是不可能的。 - Niklas
可以实现,事件过滤器允许进行很多操作而无需子类化。我给你提供了一个草稿,但我相信它需要改进。没有详细信息,很难确定你具体要做什么。 - Marek R
谢谢,我会看一下的。 - Niklas
看到更新了,我十分确定这就是你想要的。在其他情况下,你应该能够根据自己的需求进行调整。 - Marek R

2

QLabel 没有可访问的“on click”方法,但是您可以子类化 QLabel 并重新实现 mousePressEvent(QMousePress *ev) 槽,这将允许您进行点击检测。


是的,我也在这里找到了。http://www.qtcentre.org/threads/8355-QLabel-clicked%28%29 - Niklas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接