创建一个知道它属于哪个选项卡的 QLineEdit 小部件
Creating a QLineEdit Widget Which Knows Which Tab It Belongs To
问题
如何让小部件知道它属于哪个选项卡"address",最终目的是将此信息传播到信号?
背景
下面的所有代码都是在同一个对象中完成的,因此我可以使用 this
作为环回信号。
有一个设置文件将创建 "tree" 个选项卡,例如
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
。等等。
我在这里进行了简化,但最终版本将包含更多分支。为了简单起见,我没有为这个示例使用访问者 class 方法,而是将所有选项卡映射到 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] ...
问题
如何让小部件知道它属于哪个选项卡"address",最终目的是将此信息传播到信号?
背景
下面的所有代码都是在同一个对象中完成的,因此我可以使用 this
作为环回信号。
有一个设置文件将创建 "tree" 个选项卡,例如
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
。等等。
我在这里进行了简化,但最终版本将包含更多分支。为了简单起见,我没有为这个示例使用访问者 class 方法,而是将所有选项卡映射到 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] ...