单击同一功能上的多个按钮

时间:2013-08-05 13:11:32

标签: c++ qt label grid-layout function-call

这是Efficient way to make an array of labels的后续问题。

我有一个由代码(而非设计师)制作的按钮数组,这些按钮都被添加到gridlayout中。我想要的是能够点击该gridlayout上的任何按钮,并以行和列作为参数调用一个相同的函数。为什么我想要这个是因为我不想写15x15函数,它们都做同样的事情。

有没有办法或者我应该尝试寻找其他解决方案?

聚苯乙烯。我的所有其他输入都是在qt设计器中通过“转到插槽”进行的,所以如果必须发生这种情况,我将对如何进行无知。

编辑:标签数组现在是一个按钮数组。

2 个答案:

答案 0 :(得分:2)

您可以将所有按钮连接到没有参数的插槽,然后按照以下步骤获取发件人的位置:

  1. 通过QObject
  2. 将发件人qobject_cast投放到QWidget
  3. 使用QWidget
  4. 检索QLayout::indexOf(QWidget *widget)的索引
  5. 然后使用QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)
  6. 获取行,列,列范围和行范围

    示例代码如下所示:

    void MyWidgetWithAllLabels::commonSlot() 
    {
       QWidget *buttonWidget = qobject_cast<QWidget*>(sender());
       if (!buttonWidget)
          return;
    
       int indexOfButton = ui->gridLayout->indexOf(buttonWidget);
       int rowOfButton, columnOfButton, rowSpanOfButton, columnSpanOfButton;
    
       ui->gridLayout->getItemPosition(indexOfButton,
                                       &rowOfButton, &columnOfButton, &rowSpanOfButton, &columnSpanOfLabel);
        // Now you can get a reference to that specific QPushButton 
        QLayoutItem *item = ui->gridLayout->itemAtPosition(rowOfButton, columnOfButton);
        QPushButton *clickedButton = qobject_cast<QPushButton*>(item->widget());
        if (!clickedButton) 
            return;
        // ... do something with that clickedButton
    }
    

    参考相关帖子中的代码,您可以将按钮连接到该插槽,如下所示:

    connect( ui->tile_0_0, SIGNAL(clicked()),
             this, SLOT(commonSlot()));
    connect( ui->tile_0_1, SIGNAL(clicked()),
             this, SLOT(commonSlot()));
        // ...
    

答案 1 :(得分:0)

默认情况下,QLabel没有“点击”信号。 但你可以用2个整数(row,col)做你自己的QLabel,当你得到mouseReleaseEvent(或mousePressEvent)时,你会发送一个如下所示的自定义信号:clicked(int row,int col)。

您还可以使用QSignalMapper: http://qt-project.org/doc/qt-4.8/qsignalmapper.html#details