• 3816阅读
  • 6回复

自定义3个控件组合,如何获取单个控件点击事件 [复制链接]

上一主题 下一主题
离线hyue928
 

只看楼主 倒序阅读 楼主  发表于: 2017-11-23

#ifndef HLED_H
#define HLED_H
#include "ui_hled.h"
#include <QtUiPlugin/QDesignerExportWidget>
class QDESIGNER_WIDGET_EXPORT HLED : public QWidget
{
    Q_OBJECT
public:
    explicit HLED(QWidget *parent = 0);
signals:
    clicked();
private:
    Ui::HLED ui;
protected:
   void mousePressEvent(QMouseEvent *event);
};
#endif // HLED_H
初学QT自定义控件,如上图3个 pushButton 组合的 自定义控件myLED,按下后发出信号;
void HLED::mousePressEvent(QMouseEvent *event)
{
    this->setCursor(Qt::PointingHandCursor);
  emit clicked();
}

将上面控件拖放到UI里,鼠标单击OFF按钮,
#include "mainwindow.h"
#include<hled.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    ui.setupUi(this);
connect(ui.myLED,SIGNAL(clicked()),this,SLOT(ledset()));
}
void MainWindow::ledset()
{  
    ui.MT->setText("emit ok");
}
以上只能获取空白区域蓝色线的单击信号,想获取OFF的单击信号,该怎么样编写,谢谢!

离线小韩老师

只看该作者 1楼 发表于: 2017-11-23
应该不重写void mousePressEvent(QMouseEvent *event);这个函数应该可以满足你的要求,
你这个重写只是把鼠标点击时的形状改变了,信号发出来的是整体的信号你不需要,按你当前代码你就在里边进行位置判断鼠标点击在off按钮位置区间再发送click信号
离线hyue928

只看该作者 2楼 发表于: 2017-11-23
void HLED::on_OFF_clicked()
{

   emit clicked();

}

控件内部这样写,也不行,只能获取蓝色部分的单击信号.
离线笑颜

只看该作者 3楼 发表于: 2017-11-23
明显,你是不知道每个控件有单独的事件处理循环,也就是说你mouseevent只能接收按钮范围之外的事件,按钮上的事件还是被按钮处理了,你只能在eventfilter里面处理按钮的事件。
先按钮 调用btn->installEventFilter(this);
然后在eventfilter里面处理按钮事件。

请查询installEventFilter 和 eventfilter 函数用法
离线小韩老师

只看该作者 4楼 发表于: 2017-11-23
刚开始没有理解楼主意思,楼上是正解。
Qt的消息分发机制是,先分发消息给最底层的子对象,子对象不处理就把消息交给父对象,一级一级往上递推,直至最顶层的对象。
你的off按键已经处理了按键消息就不会把消息传给你的HLED类里
离线hyue928

只看该作者 5楼 发表于: 2017-11-24
谢谢 回复,可能是我描述不对,经找资料 ,我的解决方法不同,具体如下:
控件内部:
connect(ui.OFF,SIGNAL(clicked()),this,SLOT(ButclickedEmit()));
由OFF按钮 emit 给控件父窗口,
void HLED::ButclickedEmit(){    emit clicked();}
控件外部,由控件连接界面UI窗口
   connect(ui.myLED,SIGNAL(clicked()),this,SLOT(labset()));
void MainWindow::LEDset(){    ui.MT->setText("emit ok");}
总结:信号传递,由OFF emit->控件窗口-->UI窗口--LEDset;




离线qazaq408

只看该作者 6楼 发表于: 2017-11-27
最黄最暴力的办法是先设置一个枚举值
enum ButtonType{addButton,offButton,reduceButton}

然后子类化每个按钮,重写这些按钮的鼠标点击函数

  1. void customButton::mousePressEvent(QMouseEvent* e)
  2. {
  3.     if(e->button() == Qt::LeftButton)
  4.         emit hasClick(addButton);
  5.     QPushButton::mousePressEvent(e);
  6. }
然后这些信号都连接到父程序的一个槽里
  1. void parentWidget::doSomeThing(ButtonType t)
  2. {
  3.     switch(t)
  4. {
  5. case  addButton:..
  6.                          break;
  7. .
  8. .
  9. .
  10. }


快速回复
限100 字节
 
上一个 下一个