qt实现不定数量的按钮向前向后移动展示

本文详细介绍了如何使用Qt实现动态按钮的翻页展示,包括三种不同的实现方式。第一种利用动态数组和指针管理按钮,第二种简化为下标记录,减少空间使用,第三种依据显示按钮的下标判断移动边界。每种方法都提供了相应的开发环境、代码结构和实现代码示例。
摘要由CSDN通过智能技术生成

引言

此文主要记录用qt实现按钮的移动,具体效果如下:

模拟按钮移动效果

示例代码

本文记录了三种实现方式。

第一种

思路

用动态数组vector存放创建的按钮QPushButton的指针,使用两个同类型的二级指针QPushButton来指向数组中的元素,初始状态下,首尾指针都指向数组中第一个元素,随着界面初始化时需要显示的按钮的个数的增加,尾指针不断地移动,确保首指针永远指向窗中显示的按钮的第一个,尾指针指向窗口显示的按钮的最后一个按钮,同时在首尾指针处对应的各自有首计数,和尾计数,来记录当前首尾指针所在处分别是第几个元素,以一开始计数,向前移动时,当首计数为1时,不可向前,尾计数为最后一个元素时,不可向后。
在这里插入图片描述

开发环境

Qt5.15.2MinGW 64bit编译器。

代码结构

在这里插入图片描述

实现代码

下面是具体的实现代码。
mian.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
   
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "scrollbuttonwidget.h"

QT_BEGIN_NAMESPACE
namespace Ui {
    class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
   
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
   
    ui->setupUi(this);

    ScrollButtonWidget *p = new ScrollButtonWidget(this);

}

Widget::~Widget()
{
   
    delete ui;
}

scrollbuttonwidget.h

#ifndef SCROLLBUTTONWIDGET_H
#define SCROLLBUTTONWIDGET_H

#include <QWidget>
#include <vector>
#include <QPushButton>
#include <QString>

#define TOTAL_NUM 5
#define VISUAL_NUM 3

class ScrollButtonWidget : public QWidget
{
   
    Q_OBJECT
public:
    explicit ScrollButtonWidget(QWidget *parent = nullptr);
protected:
    void createButtons();
    void setLayout();
    void initInterface();
    void goBack();
    void toFront();
signals:

public slots:

private:
    std::vector<QPushButton*> m_pBtnVector;
    int m_nCurNum;
    int m_nTailNum;
    int m_nFrontNum;
    QPushButton **m_pFront;
    QPushButton **m_pTail;
};

#endif // SCROLLBUTTONWIDGET_H

scrollbuttonwidget.cpp

#include "scrollbuttonwidget.h"
#include <QHBoxLayout>
#include <QDebug>

ScrollButtonWidget::ScrollButtonWidget(QWidget *parent) : QWidget(parent)
{
   
    m_nCurNum = 0;
    m_nTailNum = 0;
    m_nFrontNum = 0;
    m_pTail = nullptr;
    m_pFront = nullptr;

    createButtons();
    setLayout();
    initInterface();
}

void ScrollButtonWidget::createButtons()
{
   
    for(int i 
  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现Qt中长按图标按钮并使其跟随鼠标移动,你可以使用以下步骤: 1. 创建一个自定义的按钮类,继承自`QPushButton`,并重写`mousePressEvent`、`mouseMoveEvent`和`mouseReleaseEvent`方法。这些方法用于处理按钮的鼠标事件。 ```cpp class CustomButton : public QPushButton { public: CustomButton(QWidget *parent = nullptr) : QPushButton(parent) {} protected: void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; }; ``` 2. 在 `mousePressEvent` 方法中,检查是否是鼠标左键按下,并记录当前鼠标置和按钮的初始置。 ```cpp void CustomButton::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 记录当前鼠标置和按钮的初始置 m_dragStartPosition = event->globalPos(); m_buttonStartPosition = this->pos(); } } ``` 3. 在 `mouseMoveEvent` 方法中,计算鼠标移动的偏移量,并将按钮置更新为初始置加上偏移量。 ```cpp void CustomButton::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 计算鼠标移动的偏移量 QPoint offset = event->globalPos() - m_dragStartPosition; // 更新按钮置 this->move(m_buttonStartPosition + offset); } } ``` 4. 在 `mouseReleaseEvent` 方法中,检查鼠标是否释放。 ```cpp void CustomButton::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 执行按钮的默认行为 QPushButton::mouseReleaseEvent(event); } } ``` 5. 在你的窗口中使用自定义按钮类。 ```cpp CustomButton *button = new CustomButton(this); button->setIcon(QIcon("path/to/your/icon.png")); button->setFixedSize(50, 50); button->setStyleSheet("QPushButton { border: none; }"); button->setCursor(Qt::PointingHandCursor); button->setToolTip("Drag me!"); button->show(); ``` 通过以上步骤,你创建了一个可以长按并跟随鼠标移动的图标按钮。当你长按按钮移动鼠标时,按钮会跟随鼠标移动,释放鼠标后按钮会执行默认的点击行为。 请注意,你需要将按钮放置在一个窗口或其他容器中,并确保启用了鼠标跟踪功能。你还可以根据需要自定义按钮的外观和行为。 希望这能帮助到你!如果有任何进一步的问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值