查看完整版本: [-- 自定义3个控件组合,如何获取单个控件点击事件 --]

QTCN开发网 -> Qt基础编程 -> 自定义3个控件组合,如何获取单个控件点击事件 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

hyue928 2017-11-23 14:53

自定义3个控件组合,如何获取单个控件点击事件


#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的单击信号,该怎么样编写,谢谢!


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

hyue928 2017-11-23 18:21
void HLED::on_OFF_clicked()
{

   emit clicked();

}

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

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

请查询installEventFilter 和 eventfilter 函数用法

小韩老师 2017-11-23 21:32
刚开始没有理解楼主意思,楼上是正解。
Qt的消息分发机制是,先分发消息给最底层的子对象,子对象不处理就把消息交给父对象,一级一级往上递推,直至最顶层的对象。
你的off按键已经处理了按键消息就不会把消息传给你的HLED类里

hyue928 2017-11-24 15:42
谢谢 回复,可能是我描述不对,经找资料 ,我的解决方法不同,具体如下:
控件内部:
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;
[attachment=18200]




qazaq408 2017-11-27 15:10
最黄最暴力的办法是先设置一个枚举值
enum ButtonType{addButton,offButton,reduceButton}

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

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




查看完整版本: [-- 自定义3个控件组合,如何获取单个控件点击事件 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled