qt学习日记10---事件、自定义控件

1 事件的介绍
在qt中,事件主要分为两种:
1. 与用户交互的,通常他们来自于底层操作系统,比如:鼠标,键盘
2. qt系统内部发生,比如:计时器事件
当一个应用程序运行时,它exec()会进入一个循环,可以 从操作系统获取事件,并将事件
放入到事件
队列中,并将它转换成一个QEvent对象,QApplication通过sendEvent函数来分发事件,
事件的接收者为QObject,在该类中提供一个虚函数QObject::event(),来处理事件。

 常用接口函数:

[static] bool QCoreApplication::sendEvent(QObject *receiver, QEvent *even t)
当sendEvent函数被调用时,可以由程序员来调用,它调用时, QObject::event ()函数会被 自动调用 该函数在调用时,那么事件对象(event)就是发送给对象(receiver),而对象的event函数也就 会被调用 ,如果对象未实现虚函数重写,那么,继续会调用基类的虚函数.
 [virtual] bool QObject::event(QEvent *e)
event函数可以被重写,比如
class MyClass : public QWidget
{
    Q_OBJECT

public:
    MyClass(QWidget *parent = 0);
    ~MyClass();

    bool event(QEvent *ev) override
    {
        //该类中,只处理了两种事件:QEvent::PolishRequest QEvent::Show
        if (ev‐> type() == QEvent::PolishRequest)
        {
            // overwrite handling of PolishRequest if any
            doThings();
            return true;
        }
        else if (ev‐> type() == QEvent::Show)
        {
            // complement handling of Show if any
            doThings2();
            QWidget::event(ev);
            return true;
        }
        return QWidget::event(ev);
    }
} ;
二 自定义控件
//MyLabel ‐‐‐‐> 继承于QLabel ‐‐‐> .... ‐‐‐‐> QObject
class MyLabel : public QLabel
{
public:
    explicit MyLabel(QWidget *parent = nullptr);
    ~MyLabel();
    bool event(QEvent *ev) override
    {
        //对于鼠标事件来进行处理 ‐‐‐‐ 通常把它叫作事件拦截‐‐‐‐本质上就是虚函数的重写
        if (ev‐> type() == QEvent::MouseButtonPress)
        {
            //将QEvent转换成 QMouseEvent
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(ev)
                //再来判断是左边或者右边鼠标的动作
                if (mouseEvent‐> button() == Qt::LeftButton)
            {
                qDebug() << "you click left button";
                return true; //代表用户对该事件进行了处理
            }
        }
        //把其他的事件,仍由基类来处理
        return QLabel::event(ev);
    }
};
自定义控件的两种使用方法:

1. 项目代码中,使用自定义控件

//MyLabel* ml = new MyLabel(this);
MyLabel* ml = new MyLabel(ui‐>centralWidget);
ml‐>setText("自定义文本控件");

 

2. 在UI界面文件中,使用自定义控件
第一步:在ui文件中,拖一个QLabel控件出来
第二步:右击该控件,选择"提升为",在弹出的对话框中,

设置完后,点击添加按钮,效果如下所示 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旋转仪表盘是一种常见的显示控件,可以用来展示一些数据,如速度、油量、温度等,下面我将介绍如何使用Qt编写一个旋转仪表盘控件。 首先,我们需要在Qt中创建一个新的自定义控件类。可以通过Qt Creator中的“添加新文件”功能来创建一个QWidget派生类。在这个类中,我们需要实现paintEvent()函数来绘制仪表盘。 在paintEvent()函数中,我们可以使用QPainter来绘制仪表盘的各个部分,包括刻度线、指针、文字等。具体实现可以参考以下代码: ```C++ void RotatingDial::paintEvent(QPaintEvent *event) { // 设置背景色 QPalette pal(palette()); pal.setColor(QPalette::Background, Qt::white); setAutoFillBackground(true); setPalette(pal); // 绘制刻度线 QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.translate(width() / 2, height() / 2); painter.setPen(QPen(Qt::black, 2)); for (int i = 0; i < 60; i++) { painter.drawLine(0, -100, 0, -90); painter.rotate(6); } // 绘制指针 painter.save(); painter.rotate(m_angle); painter.setBrush(Qt::red); painter.setPen(Qt::NoPen); painter.drawConvexPolygon(m_pointer, 3); painter.restore(); // 绘制文字 QFont font("Arial", 12, QFont::Bold); painter.setFont(font); painter.drawText(-30, 50, "Speed"); } ``` 在上面的代码中,我们首先设置了控件的背景色为白色。然后使用QPainter绘制了60条刻度线,并旋转6度。接着,我们绘制了一个红色的指针,并根据m_angle属性来旋转指针的角度。最后,我们使用QPainter绘制了文字“Speed”。 在我们的自定义控件中,我们需要一个属性来控制指针的角度。我们可以使用Q_PROPERTY宏来定义这个属性,例如: ```C++ class RotatingDial : public QWidget { Q_OBJECT Q_PROPERTY(int angle READ angle WRITE setAngle) public: RotatingDial(QWidget *parent = nullptr); int angle() const; void setAngle(int angle); private: int m_angle; QPolygon m_pointer; }; ``` 在上面的代码中,我们使用Q_PROPERTY宏定义了angle属性,并提供了getter和setter函数。我们还定义了一个私有变量m_angle来存储当前的角度,以及一个QPolygon对象m_pointer来存储指针的形状。 在setAngle()函数中,我们设置m_angle属性,并根据新的角度计算指针的位置: ```C++ void RotatingDial::setAngle(int angle) { if (angle != m_angle) { m_angle = angle; m_pointer.setPoint(0, QPoint(0, -90)); m_pointer.setPoint(1, QPoint(5, 0)); m_pointer.setPoint(2, QPoint(-5, 0)); m_pointer.translate(0, 100); update(); } } ``` 在上面的代码中,我们首先判断新的角度是否与当前的角度相同。如果不同,我们就更新m_angle属性,并重新计算指针的位置。最后,我们调用update()函数来触发paintEvent()函数的调用,从而完成控件的重绘。 最后,我们可以在MainWindow类中使用我们的自定义控件,例如: ```C++ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { RotatingDial *dial = new RotatingDial(this); dial->setAngle(30); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(dial); setCentralWidget(new QWidget); centralWidget()->setLayout(layout); } ``` 在上面的代码中,我们创建了一个RotatingDial对象,并设置了初始角度为30度。然后,将其添加到QHBoxLayout布局中,并设置为主窗口的中央控件。 至此,我们已经完成了一个简单的旋转仪表盘的自定义控件。你可以根据需要对其进行扩展和优化,使其更加适合你的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值