我创建四个按钮和一个QList, 列表中存放的是四个按钮的左上角坐标,如何将这四个数据和四个按钮唯一绑定,移动按钮,只会修改那一个数字,这个数字在列表的第几个是不确定的
数字在列表的第几个是不确定的,为啥要不确定呢???
你完全可以确定的,存入四个变量在数组里面,按钮移动改变对应变量的值不就行了。
实际都不需要变量也行,按钮移动改变对应下标的值也行了。
在Qt中,你可以创建自定义信号和槽以实现你的需求。以下是如何实现的步骤:
positionChanged()
信号,每当按钮的位置改变时,这个信号就会被触发。//在你的按钮类中
class MyButton : public QPushButton
{
Q_OBJECT
public:
explicit MyButton(QWidget *parent = nullptr);
...
signals:
void positionChanged(QPoint newPos);
...
};
mouseMoveEvent
方法中改变了按钮的位置,你可以在那里触发positionChanged
信号。void MyButton::mouseMoveEvent(QMouseEvent *event)
{
...
//假设newPos是新的位置
emit positionChanged(newPos);
}
updatePositionInList(QPoint newPos)
。当按钮的位置改变信号被触发时,这个槽函数就会被调用,并把新的位置传递给它。class MyClass : public QObject
{
Q_OBJECT
public:
MyClass();
...
public slots:
void updatePositionInList(QPoint newPos);
...
};
在updatePositionInList(QPoint newPos)
函数中,你可以根据新的位置更新列表。
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)
就会被调用,你就可以在列表中更新那个位置了。
请注意,这个实现依赖于你的需求和你的实际代码结构,你可能需要根据你的具体情况对其进行修改。
移除函数和删除函数调用之前都要判断列表是否非空,用 ! 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() 函数才是删除列表所有元素,并释放内存空间。