2015-05-01 86 views
0

我想制作一个QLabel可点击并遵循this“how-to”。我不知道如何将这段代码放到我的GUI中(我对qt很陌生)。我所做的是:为什么我的mousePressEvent调用两次?

  1. 我创建了一个新的类(的ClickableLabel只是复制/粘贴从链接,但我改变了信号clicked(QMouseEvent* event)
  2. 我添加了一个QLabel我的GUI和“提升”它到ClickableLable
  3. 连接信号到我的主窗口的一个插槽其中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*),因此我认为我没有以这种方式创建连接...

+0

不确定它是相关的,但奇怪的是他们没有调用QLabel :: mousePressEvent(event);在ClickableLabel :: mousePressEvent之前做其他动作(在你的情况下发出信号) – demonplus

+0

你能告诉我们你重新实现'mousePressEvent()'吗? –

+0

@JonHarper是的我可以 – user463035818

回答

0

我可以修复它,但我没有明白发生了什么...

这不是被发射两次的mousePressEvent,但我的on_label_clicked插槽收到事件两次。

我删除了connect声明,并且现在每个点击只调用一次on_label_clicked。看起来好像有些事情正在发生。也许当插槽被称为on_label_clicked时,它会自动(“qtmatically”)连接到从名为label的孩子中删除的鼠标事件?

编辑:仍没有找到官方文档,但this blog解释得很好。总之,人们只需要使用命名惯例为插槽

void on_<widget name="">_<signal name="">(<signal parameters="">); 

使用自动连接功能。

+0

没有自动连接插槽。我的猜测是你的connect()被调用了两次。如果您将同一个信号连接两次到同一个插槽,则在信号发出一次后,我们会调用两次插槽。 –

+1

如果@FrankOsterfeld是正确的,你可以使用[Qt :: UniqueConnection](http://doc.qt.io/qt-5/qt.html#ConnectionType-enum)来阻止它。 – Maxito

+0

当您的插槽名称为ON_NAME_SIGNAL时,我看到了自动连接,就像设计师命名它们一样。 @ tobi303尝试删除on_,你不应该得到任何信号了。只要看看生成的ui _ *。h文件。你应该看到一次连接,一次没有连接。 – fassl

相关问题