画一个矩形,点击的时候边线闪烁,且两边的边线的中间有一个实心的圆形

qt 6.7 画一个矩形,要求点击的时候边线闪烁,且两边的边线的中间有一个实心的圆形,用到信号和槽的类需要将头文件和资源文件分开,请提供完整代码

为了提供完整的代码示例,我们将创建一个简单的Qt Widgets应用程序,其中包含一个自定义的QWidget,它会在被点击时闪烁其边框,并在边框两侧的中心位置绘制实心圆形。

首先,确保你已经安装了Qt 6.7和相应的开发环境。

1. 创建头文件 FlashingRectWidget.h  

#ifndef FLASHINGRECTWIDGET_H  
#define FLASHINGRECTWIDGET_H  
  
#include <QWidget>  
#include <QTimer>  
#include <QPainter>  
#include <QMouseEvent>  
  
class FlashingRectWidget : public QWidget {  
    Q_OBJECT  
  
public:  
    explicit FlashingRectWidget(QWidget *parent = nullptr);  
    ~FlashingRectWidget();  
  
signals:  
    void clicked();  
  
protected:  
    void paintEvent(QPaintEvent *event) override;  
    void mousePressEvent(QMouseEvent *event) override;  
  
private slots:  
    void toggleBorderVisibility();  
  
private:  
    QTimer *timer;  
    bool showBorder;  
};  
  
#endif // FLASHINGRECTWIDGET_H

2. 创建源文件 FlashingRectWidget.cpp

#include "FlashingRectWidget.h"  
  
FlashingRectWidget::FlashingRectWidget(QWidget *parent) : QWidget(parent), showBorder(true) {  
    timer = new QTimer(this);  
    connect(timer, &QTimer::timeout, this, &FlashingRectWidget::toggleBorderVisibility);  
    timer->setInterval(500); // 0.5 seconds  
}  
  
FlashingRectWidget::~FlashingRectWidget() {  
    delete timer;  
}  
  
void FlashingRectWidget::paintEvent(QPaintEvent *event) {  
    Q_UNUSED(event)  
    QPainter painter(this);  
    painter.setRenderHint(QPainter::Antialiasing, true);  
  
    // Draw the rectangle  
    QRectF rect(10, 10, width() - 20, height() - 20);  
    if (showBorder) {  
        painter.setPen(QPen(Qt::black, 2));  
        painter.drawRect(rect);  
    }  
  
    // Draw circles in the middle of the sides  
    QPointF leftCircleCenter(rect.left() + rect.width() / 4, rect.center().y());  
    QPointF rightCircleCenter(rect.right() - rect.width() / 4, rect.center().y());  
    painter.setBrush(Qt::black);  
    painter.drawEllipse(leftCircleCenter, 10, 10);  
    painter.drawEllipse(rightCircleCenter, 10, 10);  
}  
  
void FlashingRectWidget::mousePressEvent(QMouseEvent *event) {  
    if (event->button() == Qt::LeftButton) {  
        if (!timer->isActive()) {  
            timer->start();  
            emit clicked();  
        } else {  
            timer->stop();  
        }  
    }  
}  
  
void FlashingRectWidget::toggleBorderVisibility() {  
    showBorder = !showBorder;  
    update(); // Triggers a repaint  
}

3. 创建主函数文件 main.cpp

#include <QApplication>  
#include "FlashingRectWidget.h"  
  
int main(int argc, char *argv[]) {  
    QApplication app(argc, argv);  
    FlashingRectWidget widget;  
    widget.show();  
    return app.exec();  
}

4. 创建Qt项目文件 .pro

TEMPLATE = app  
TARGET = FlashingRectExample  
QT = core gui  
SOURCES += main.cpp \  
           FlashingRectWidget.cpp  
HEADERS += FlashingRectWidget.h

将上述四个文件放在同一个目录中,并使用Qt Creator或命令行工具来构建和运行项目。当你点击矩形时,其边框应该会开始闪烁,同时两侧的实心圆形始终保持可见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值