我有10个Qlabels,每个都有一个图像。当我点击标签时,应清除其图像。我能够使用点击的像素和每个图像的大小来识别哪个标签被理论上点击了。但是如何使用这些信息?
EG。每个标签的尺寸为100 * 100,第一个标签从0,0开始。如果点击的像素是250,50,我知道点击了第三个标签,但是如何使用它来清除标签。 我卡住了。
答案 0 :(得分:1)
如何实施它有几种方法。
首先。我建议使用一个继承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窗口小部件,并检查当前哪个窗口在鼠标下并清除它。如果此小部件上有其他标签,不应在鼠标单击时清除,那么您可以将一些属性添加到您感兴趣的QLabel中。
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()位于同一小部件上的检查,以避免触发拖放事件。
答案 1 :(得分:1)
创建继承QLabel的自定义类:
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();
}