Qt 创建一个QLineEdit小部件,它知道它属于哪个选项卡 问题:

Qt 创建一个QLineEdit小部件,它知道它属于哪个选项卡 问题:,qt,signals-slots,qmap,Qt,Signals Slots,Qmap,如何使小部件知道它属于哪个选项卡“地址”,最终目的是将此信息传播到信号 背景 下面的所有代码都是在同一个对象中完成的,因此我可以使用this作为环回信号 有一个设置文件,它将创建选项卡的“树”,例如 Sh(0) -> Be(0) -> Fe(0) Sh(0) -> Be(1) -> Fe(0) Sh(1) -> Be(0) -> Fe(1) 这将创建一个Sh 0选项卡,其中包含一个显示Be 0的选项卡和一个显示Be 1的选项卡Be 0将包含Fe 0的最后一个

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

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

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

Sh(0) -> Be(0) -> Fe(0)
Sh(0) -> Be(1) -> Fe(0)
Sh(1) -> Be(0) -> Fe(1)
这将创建一个
Sh 0
选项卡,其中包含一个显示
Be 0
的选项卡和一个显示
Be 1
的选项卡<此分支中的code>Be 0将包含
Fe 0
的最后一个选项卡。等等

我在这里对其进行了简化,但最终版本将包含更多分支。为了保持简单,我没有为本例的visitor类方法费心,而是将所有选项卡映射到
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;
问题 太好了,所以我将所有选项卡分配到一个地图,并用
QGridLayout
填充
Fe
选项卡。然后,我通过在布局中添加
QLineEdit
来循环我想要添加的寄存器

设置文件中的内容与问题无关。这只是针对树的每个分支完成的,设置文件使用预定义值创建许多预定义寄存器。我想让
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
,并尝试阅读当前关注的选项卡以确定地址,尽管我不确定如何做到这一点,也不确定是否有更简单的方法。

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

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] ...

您的代码示例不清楚,因为它不完整。在(auto&kv:nSettings)循环的
上下文中,“this”是什么?我在这里简化了它,因为真正的代码太长而且不重要。这只是一个循环,通过设置文件中的默认值查看
QLineEdit
,但您不必担心这一点。例如,它会告诉它为特定的分支创建10个寄存器,并用预定义的值填充它。
这个
就是我当前所在的对象,上面所有的代码都是在同一个对象中完成的。所以它会向自身发出信号,如果你明白我的意思的话?i、 e一个环回信号。我感兴趣的是,
QLineEdit
如何知道它在哪个选项卡分支中。因此,如果我在
m_mapWidget[0][0][0]
中编辑一个值,信号如何知道它所在的结构?我也许可以从它的家长选择的标签标题的信息,但我不知道如何做到这一点,或者如果有一个更简单的方法,这是足够的信息?关于这个问题,我已经尽可能地详细,而不是夸大我如何创造其他一切。