-1

问题

如何使小部件知道它属于哪个选项卡“地址”,最终目的是将此信息传播到信号?

背景

下面的所有代码都是在同一个对象中完成的,因此我可以将this其用作环回信号。

有一个设置文件将创建一个选项卡的“树”,例如

Sh(0) -> Be(0) -> Fe(0)
Sh(0) -> Be(1) -> Fe(0)
Sh(1) -> Be(0) -> Fe(1)

这将创建一个Sh 0选项卡,其中包含一个选项卡显示Be 0和一个选项卡显示Be 1Be 0在此分支中将包含Fe 0. 等等。

我在这里对其进行了简化,但最终版本将包含更多分支。为了简单起见,我不会为这个示例的访问者类方法而烦恼,而是我将所有选项卡映射到一个QMap,例如,如果您想feTab从上面的第一个示例访问该选项卡,则创建该选项卡,然后像这样访问:

QTabWidget *feTab = new QTabWidget(this);
m_mapTab[idSh][idBe] = feTab;

QGridLayout *lo = new QGridLayout;
m_mapTab[idSh][idBe][idFe]->addLayout(lo)
m_mapLo[idSh][idBe][idFe] = lo;

问题

太好了,所以我将所有选项卡分配给地图并Fe使用QGridLayout. QLineEdit然后,我通过在布局中添加 a 来遍历我想要添加的寄存器 。

设置文件中的内容与问题无关。这只是针对树的每个分支完成的,设置文件会创建许多具有预定义值的预定义寄存器。我想QLineEdit知道它在编辑时来自哪个分支。

for (auto& kv : nSettings)
{
    ... //code to work out row and column + make it all look nice + add a layout
    QLineEdit *lineRegValue = new QLineEdit(this);
    lineRegValue->setText(value[kv]);
    clo->addWidget(lineRegValue);
    m_mapLo[idSh][idBe][idFe]->addLayout(clo, row, column);
}

我的尝试

因此,我一直在尝试将信号分配给QLineEdit我创建它的时候,如下所示:

connect(lineRegValue, SIGNAL(textEdited(QString)),
                    this, SLOT(onValueChanged(QString)));

我已经连接了一种方法,该方法输出qDebug(). 问题是我不确定如何告诉系统它所属的树地址。我可以使用这些信息来创建一个带有用户更改值的新设置文件。有任何想法吗?

我的第一个想法是查看QLineEdit已选择的选项卡并尝试阅读当前关注的选项卡以计算出地址,尽管我不确定如何执行此操作以及是否有更简单的方法。

4

1 回答 1

1

一种可能的常见解决方案:

int GetTabIndex( QTabWidget *tw, QWidget *anyWidget )
{
  Q_ASSERT( tw != nullptr );
  QWidget *p = anyWidget;
  while ( p != nullptr )
  {
    if ( p->parentWidget() == tw )
      return tw->indexOf( p );
    p = p->parentWidget();
  }
  return -1;
}

//...
QLineEdit *le = /*some line editor, on a tab*/;
QTabWidget *tw = /*Your tab widget*/

int tabIndex = GetTabIndex( tw, le ); // index of tab, where line editor is located;

您可以递归地应用它来获取子选项卡的所有索引。

QLineEdit *le = /*some line editor, on a tab*/;
QTabWidget *root = /*Root tab*/
const int x = GetTabIndex( root, le );
QTabWidget *tabChild1 = root->widget( x );
const int y = GetTabIndex( tabChild1 , le );
QTabWidget *tabChild2 = tabChild1 ->widget( y );
const int z = GetTabIndex( tabChild2 , le );

yourArray[x][y][z] ...
于 2015-04-03T11:18:53.403 回答