qt如何将列表中的数据绑定给一些控件

我创建四个按钮和一个QList, 列表中存放的是四个按钮的左上角坐标,如何将这四个数据和四个按钮唯一绑定,移动按钮,只会修改那一个数字,这个数字在列表的第几个是不确定的

数字在列表的第几个是不确定的,为啥要不确定呢???
你完全可以确定的,存入四个变量在数组里面,按钮移动改变对应变量的值不就行了。
实际都不需要变量也行,按钮移动改变对应下标的值也行了。

在Qt中,你可以创建自定义信号和槽以实现你的需求。以下是如何实现的步骤:

  1. 首先,你需要在按钮类中创建一个自定义信号。例如,你可以创建一个positionChanged()信号,每当按钮的位置改变时,这个信号就会被触发。
//在你的按钮类中
class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = nullptr);
    ...
signals:
    void positionChanged(QPoint newPos);
    ...
};
  1. 当按钮位置改变时,触发这个信号。例如,如果你在mouseMoveEvent方法中改变了按钮的位置,你可以在那里触发positionChanged信号。
void MyButton::mouseMoveEvent(QMouseEvent *event)
{
    ...
    //假设newPos是新的位置
    emit positionChanged(newPos);
}
  1. 在你的主要逻辑类中,创建一个槽函数,例如updatePositionInList(QPoint newPos)。当按钮的位置改变信号被触发时,这个槽函数就会被调用,并把新的位置传递给它。
class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass();
    ...
public slots:
    void updatePositionInList(QPoint newPos);
    ...
};

updatePositionInList(QPoint newPos)函数中,你可以根据新的位置更新列表。

  1. 最后,你需要把按钮的positionChanged信号和你的updatePositionInList(QPoint newPos)槽函数连接起来。你可以在你的主要逻辑类的构造函数中,或者在创建按钮的地方做这个事情。
//假设buttons是你的按钮列表,myClass是你的主要逻辑类的实例
for(int i = 0; i < buttons.size(); ++i)
{
    connect(buttons[i], SIGNAL(positionChanged(QPoint)), myClass, SLOT(updatePositionInList(QPoint)));
}

这样,每当按钮的位置改变,updatePositionInList(QPoint newPos)就会被调用,你就可以在列表中更新那个位置了。

请注意,这个实现依赖于你的需求和你的实际代码结构,你可能需要根据你的具体情况对其进行修改。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/188589
  • 这篇博客也不错, 你可以看下Qt-制作一个简单的计算器-实现四则运算
  • 除此之外, 这篇博客: 三、Qt常用容器之QList中的 4、删除和移动类函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 移除函数和删除函数调用之前都要判断列表是否非空,用 ! empty() 或 ! isEmpty() 判断,带有序号 i 的必须保证序号不越界。

    T takeAt(int i) //移除序号为 i 元素并返回该元素
    T takeFirst() //移除队头元素并返回该元素
    T takeLast() //移除队尾元素并返回该元素

    take**() 移除函数只是将元素从列表中卸载下来,并不会删除元素内存空间,卸下来的元素作为返回值返回。

    void removeAt(int i) //删除序号为 i 的元素,释放该元素内存
    void removeFirst() //删除队头元素,释放该元素内存
    void pop_front() //同 removeFirst() ,STL风格
    void removeLast() //删除队尾元素,释放该元素内存
    void pop_back() //同 removeLast(),STL风格

    remove**() 函数没有返回值,直接从列表删除元素,并释放该元素内存空间,删除的元素彻底消失。

    int removeAll(const T & value) //删除列表中所有等于 value 值的元素,返回删除的数量
    bool removeOne(const T & value) //删除列表中第一个等于 value 值的元素,如果列表有等于 value 值的元素,返回 true,否则返回 false

    注意 removeAll( value ) 函数不是清空列表,而是删除列表中所有等于 value 值的元素,并返回删除的计数。
    removeOne( value ) 函数第一个等于 value 值的元素,如果删除成功返回 true,即列表中存在等于 value 的元素,
    如果删除失败返回 false,即列表中不存在等于 value 的元素。需要特别注意的是:
    removeAll( value )、removeOne( value )这两个函数必 须要类型 T 存在 operator==() 等于号函数,T 类型能够进行相等判断!

    void clear()

    clear() 函数才是删除列表所有元素,并释放内存空间。

  • 您还可以看一下 飞鱼老师的Qt断点调试技巧课程中的 断点操作与调试窗口介绍小节, 巩固相关知识点