识别在qt中点击了哪个标签

Identifying which label was clicked in qt

我有 10 个 Qlabel,每个 Qlabel 上都有一张图片。当我点击一个标签时,它的图像应该被清除。我能够使用点击的像素和每个图像的大小来识别理论上点击了哪个标签。但是如何使用这些信息呢?

例如。每个标签的尺寸为 100*100,第一个标签从 0,0 开始。如果点击的像素是 250,50,我知道第三个标签被点击了,但是如何使用它来清除标签。 我卡住了。

有几种实现方法。

首先。我建议使用新的 class 继承 QLabel 并重载 mouseReleaseEvent() 处理程序,您只需在其中调用 clear() 方法。在这种情况下,标签将检测鼠标点击本身并在内部清除其内容。

class SelfClearingLabel : public QLabel
{
   public:
     using QLabel::QLabel;

   protected:

     void mouseReleaseEvent(QMouseEvent * event)
     {
         if (event->button()==Qt::LeftButton) 
           // process only clicks on the left button
         {
            clear();
         }
         QLabel::mouseReleaseEvent(event);
     }
};

其次。您可以在顶部小部件中捕获 mouseReleaseEvent() 并遍历所有子 QLabel 小部件并检查哪个当前在鼠标下并清除那个。如果您在此小部件上有其他标签不应通过单击鼠标清除,那么您可以将一些 属性 添加到您感兴趣的 QLabels 中。

void SomeTopFrame::createImageLabels(int count)
{
    for (int i=0;i<count;i++)
    {
       QLabel* label=new QLabel(this);
       label->setProperty("clear_on_click",true);
       // assume that labels are added to layout *m_labelsLayout;
       m_labelsLayout->addWidget(label);
    }
}

 void SomeTopFrame::mouseReleaseEvent(QMouseEvent * event)
 {
     if (event->button()==Qt::LeftButton) 
       // process only clicks on the left button
     {
        QList<QLabel*> labels=findChildren<QLabel*>();
        foreach (QLabel* label, labels)
        {
          if (label->property("clear_on_click")&&label->underMouse())
          {
             label->clear();
             break;
          }
        } 
     }
     QFrame::mouseReleaseEvent(event);
 }

示例代码,只是为了说明原理。在生产中,您可以添加一个检查,确保 mouseReleaseEvent() 与 mousePressEvent() 在同一个小部件上,以避免触发拖放事件。

创建继承 QLabel 的自定义 class :

ClickableLabel.h

class ClickableLabel : public QLabel
{
Q_OBJECT
public:
    explicit ClickableLabel( const QString& text="", QWidget* parent=0 );
    ~ClickableLabel();
signals:
    void clicked();
protected:
    void mousePressEvent(QMouseEvent* event);
};


ClickableLabel.cpp

ClickableLabel::ClickableLabel(const QString& text, QWidget* parent)
    : QLabel(parent)
{
    setText(text);
}

ClickableLabel::~ClickableLabel()
{
}

void ClickableLabel::mousePressEvent(QMouseEvent* event)
{
    emit clicked();
}

只需将所有标签点击信号连接到以下插槽:

MyClass::labelClicked() 
{
    ClickableLabel *label = (ClickableLabel*)QObject::sender;
    if(label)
        label->clear();
}