这是Efficient way to make an array of labels的后续问题。
我有一个由代码(而非设计师)制作的按钮数组,这些按钮都被添加到gridlayout中。我想要的是能够点击该gridlayout上的任何按钮,并以行和列作为参数调用一个相同的函数。为什么我想要这个是因为我不想写15x15函数,它们都做同样的事情。
有没有办法或者我应该尝试寻找其他解决方案?
聚苯乙烯。我的所有其他输入都是在qt设计器中通过“转到插槽”进行的,所以如果必须发生这种情况,我将对如何进行无知。
编辑:标签数组现在是一个按钮数组。
答案 0 :(得分:2)
您可以将所有按钮连接到没有参数的插槽,然后按照以下步骤获取发件人的位置:
QObject
qobject_cast
投放到QWidget
QWidget
QLayout::indexOf(QWidget *widget)
的索引
QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)
示例代码如下所示:
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