我想制作一个QLabel可点击并遵循this“how-to”。我不知道如何将这段代码放到我的GUI中(我对qt很陌生)。我所做的是:为什么我的mousePressEvent调用两次?
- 我创建了一个新的类(的
ClickableLabel
只是复制/粘贴从链接,但我改变了信号clicked(QMouseEvent* event)
) - 我添加了一个QLabel我的GUI和“提升”它到
ClickableLable
连接信号到我的主窗口的一个插槽其中I
std::cout
一些东西:connect(this->ui->label,SIGNAL(clicked(QMouseEvent*)), this,SLOT(on_label_clicked(QMouseEvent*)));
它似乎工作。问题是,每次我点击标签mousePressedEvent
被调用两次。我也试过mouseReleasedEvent
但它是一样的。
任何想法可能出错?
编辑:这是我的修改ClickableLable
:
class MyClickableLabel : public QLabel {
Q_OBJECT
public:
MyClickableLabel(QWidget* parent=0);
~GBoardLabel();
signals:
void clicked(QMouseEvent* event);
protected:
void mouseReleaseEvent(QMouseEvent* event);
};
MyClickableLabel::MyClickableLabel(QWidget* parent) : QLabel(parent) {this->setText("");}
MyClickableLabel::~MyClickableLabel() {}
void MyClickableLabel::mouseReleaseEvent(QMouseEvent *event){
std::cout << "CLICKED R" << std::endl;
std::cout << event->type() << std::endl;
std::cout << event->pos().x() << std::endl;
std::cout << event->pos().y() << std::endl;
emit clicked(event);
}
的cout
S IN的在我后来才加入意识到mouseReleaseEvent
实际上只调用一次上面的方法。但是,当我将clicked
连接到主窗口的插槽时,此插槽会收到两次事件。
然后,我删除了connect
声明,令我惊讶的是信号仍然被命中和接收(只有一次)。我有点困惑这是如何工作的,因为我非常肯定,我没有错误地在代码中的任何地方有connect
。
我的标签正在工作,但我想了解正在发生的事情。其实我不是100%肯定了,我没有使用一些Qt创建者功能进行连接。但是,我不知道在哪里可以找到这样的连接。例如,我在同一个主窗口上有一个QButton
。在gui编辑器中,我右键单击它,然后“显示插槽” - >“clicked()” - >“确定”,并自动创建一个名为on_pushButton_clicked()
的方法,但我不知道在哪里调用/按钮的信号连接到这个方法。另一方面,我没有在我的标签列表中列出MyClickableLabel::clicked(QMouseEvent*)
,因此我认为我没有以这种方式创建连接...
不确定它是相关的,但奇怪的是他们没有调用QLabel :: mousePressEvent(event);在ClickableLabel :: mousePressEvent之前做其他动作(在你的情况下发出信号) – demonplus
你能告诉我们你重新实现'mousePressEvent()'吗? –
@JonHarper是的我可以 – user463035818