QT 从布局中检索自定义小部件
QT retrieve custom widget from layout
我有一个滚动区域,其布局中添加了 8 个相同的自定义小部件。这个自定义小部件有一个 getter 函数,它将 return 一个值。我的问题是如何取回原始自定义小部件,以便我可以调用 getter 函数来检索它存储的数据?
我已经通过这种方式将自定义小部件添加到布局中:
for (int var = 0; var < 9; ++var) {
calcRow *CalcWidget = new calcRow(this, &js, KeyList, SizeList);
connect(CalcWidget, &calcRow::testSignal, this, &MainWindow::getRowData);
ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}
我卡在哪里:
void MainWindow::getRowData()
{
for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();
if(row != NULL)
{
std::cout << row->"SOMETHING TO GET CALCROW WIDGET" <<std::endl;
}
}
}
通常这不是您代码的最佳结构,任何布局更改都可能会破坏您的实现。例如,如果您有多个 calcRow
小部件,则此解决方案将不起作用。
为了让它变得更好,您可以传递您想要在 getRowData
中使用的必需参数作为 testSignal
信号的参数。
或者使用 lambda 进一步简化它:
for (int var = 0; var < 9; ++var) {
calcRow* CalcWidget = new calcRow(this, &js, KeyList, SizeList);
connect(CalcWidget, &calcRow::testSignal, [CalcWidget]()
{
std::cout << CalcWidget->"SOMETHING TO GET CALCROW WIDGET" << std::endl;
});
ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}
对于将来会发现它的任何其他人,这些评论帮助了很多,我最终使用了 static_cast
。我的最终代码如下所示:
void MainWindow::getRowData()
{
for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();
calcRow *rowConverted = static_cast<calcRow*>(row);
if(row != NULL)
{
std::cout << rowConverted ->getData() <<std::endl;
}
}
}
我有一个滚动区域,其布局中添加了 8 个相同的自定义小部件。这个自定义小部件有一个 getter 函数,它将 return 一个值。我的问题是如何取回原始自定义小部件,以便我可以调用 getter 函数来检索它存储的数据?
我已经通过这种方式将自定义小部件添加到布局中:
for (int var = 0; var < 9; ++var) {
calcRow *CalcWidget = new calcRow(this, &js, KeyList, SizeList);
connect(CalcWidget, &calcRow::testSignal, this, &MainWindow::getRowData);
ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}
我卡在哪里:
void MainWindow::getRowData()
{
for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();
if(row != NULL)
{
std::cout << row->"SOMETHING TO GET CALCROW WIDGET" <<std::endl;
}
}
}
通常这不是您代码的最佳结构,任何布局更改都可能会破坏您的实现。例如,如果您有多个 calcRow
小部件,则此解决方案将不起作用。
为了让它变得更好,您可以传递您想要在 getRowData
中使用的必需参数作为 testSignal
信号的参数。
或者使用 lambda 进一步简化它:
for (int var = 0; var < 9; ++var) {
calcRow* CalcWidget = new calcRow(this, &js, KeyList, SizeList);
connect(CalcWidget, &calcRow::testSignal, [CalcWidget]()
{
std::cout << CalcWidget->"SOMETHING TO GET CALCROW WIDGET" << std::endl;
});
ui->scrollArea_layout->layout()->addWidget(CalcWidget);
}
对于将来会发现它的任何其他人,这些评论帮助了很多,我最终使用了 static_cast
。我的最终代码如下所示:
void MainWindow::getRowData()
{
for (int i = 0;i < ui->scrollArea_layout->layout()->count() ;++i ) {
QWidget *row = ui->scrollArea_layout->layout()->itemAt(i)->widget();
calcRow *rowConverted = static_cast<calcRow*>(row);
if(row != NULL)
{
std::cout << rowConverted ->getData() <<std::endl;
}
}
}