处理来自动态按钮阵列的信号

Processing signals from a dynamic button array

本文关键字:阵列 信号 按钮 动态 处理      更新时间:2023-10-16

我正在创建一个类,它是QWidget的子代,由按钮(按钮表)组成。现在,这个对象发送的信号很简单:void wasClicked(size_t x, size_t y),它在网格中发送按钮坐标。但为此,我需要将QPushButton的点击信号连接到我的小部件。由于插槽/信号的数量取决于网格大小,而网格大小不是在运行时确定的,所以我无法提前创建足够的插槽。那我该怎么办?

我会连接按钮,以便它们都向同一个插槽发送信号。

我没有测试这个代码。这只是概念验证的尝试

class ButtonTable : public QWidget 
{    
    Q_OBJECT       
public:
    ButtonTable()
    void createButtons();

private:
    int height;
    int width;
    QVector<Button*> buttons
private slots:
   btnClicked();
};
void ButtonTable::createButtons() {
    for (int i = 0; i < height; ++i) {
        for (int j = 0; j < width; j++) {
            Button* btn = new Button(this);
            btn.row = i;
            btn.col = j;
            connect(button, SIGNAL(clicked()), this, SLOT(btnClicked()));
            buttons.push_back(btn);
        }
    } 
}

void ButtonTable::btnClicked()
{
   Button *btn = qobject_cast<Button *>(sender());  
   //Do something with button
}

class Button : public QToolButton
{
    Q_OBJECT
public:
    explicit Button(QWidget *parent = 0);
    int row;
    int col;
};

所以有很多按钮,但每个clicked()按钮都指向一个插槽。您可以使用QObject::sender()找到按下的按钮,因为它们是从QToolButton继承的自定义按钮,所以您可以在该类中存储所需的额外信息。

请记住,由于动态大小的原因,您还必须以编程方式进行按钮的布局。