Qt findChildren() 函数仅 return 第一个子对象
Qt findChildren() function only return first child object
我遇到了 QDockWidget
和 QMainWindow
的问题,我在主窗口中添加了三个 dockwidgets 并将它们制表。为了自定义这些标签栏,使用 QMainWindow::findChildren()
函数获取标签栏的指针。但是 return 结果只给我列表中的第一个标签栏指针。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget* widCenter =this->takeCentralWidget();
if(widCenter)
{
delete widCenter;
widCenter = nullptr;
}
MyDockWidget* m1 = new MyDockWidget(this);
MyDockWidget* m2 = new MyDockWidget(this);
MyDockWidget* m3 = new MyDockWidget(this);
m1->setWindowTitle("m1");
m2->setWindowTitle("m2");
m3->setWindowTitle("m3");
this->setDockOptions(QMainWindow::AllowTabbedDocks);
this->addDockWidget(Qt::TopDockWidgetArea, m1);
this->addDockWidget(Qt::TopDockWidgetArea, m2);
this->addDockWidget(Qt::TopDockWidgetArea, m3);
//this->splitDockWidget(m1, m2, Qt::Horizontal);
this->tabifyDockWidget(m1, m2);
this->tabifyDockWidget(m2, m3);
this->setTabPosition(Qt::TopDockWidgetArea, QTabWidget::North);
m_list=this->findChildren<QTabBar*>(QString(), Qt::FindChildrenRecursively);
qDebug() << "size = "<<m_list.size();
if(m_list.size() > 0)
{
qDebug() << "text = "<< m_list[0]->tabText(0);
qDebug() << "text = "<< m_list[0]->tabText(1);
qDebug() << "text = "<< m_list[0]->tabText(2);
}
}
和调试结果:
size = 1
text = "m1"
您提供的少量代码确实只有一个标签栏。 QObject::findChildren()
的选项参数默认设置为 Qt::FindChildrenRecursively
,所以如果你有更多,它会更重要。
一般你有以下几种情况:
- tabbar 包含标签
- 每个选项卡代表一个停靠的小部件
我遇到了 QDockWidget
和 QMainWindow
的问题,我在主窗口中添加了三个 dockwidgets 并将它们制表。为了自定义这些标签栏,使用 QMainWindow::findChildren()
函数获取标签栏的指针。但是 return 结果只给我列表中的第一个标签栏指针。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget* widCenter =this->takeCentralWidget();
if(widCenter)
{
delete widCenter;
widCenter = nullptr;
}
MyDockWidget* m1 = new MyDockWidget(this);
MyDockWidget* m2 = new MyDockWidget(this);
MyDockWidget* m3 = new MyDockWidget(this);
m1->setWindowTitle("m1");
m2->setWindowTitle("m2");
m3->setWindowTitle("m3");
this->setDockOptions(QMainWindow::AllowTabbedDocks);
this->addDockWidget(Qt::TopDockWidgetArea, m1);
this->addDockWidget(Qt::TopDockWidgetArea, m2);
this->addDockWidget(Qt::TopDockWidgetArea, m3);
//this->splitDockWidget(m1, m2, Qt::Horizontal);
this->tabifyDockWidget(m1, m2);
this->tabifyDockWidget(m2, m3);
this->setTabPosition(Qt::TopDockWidgetArea, QTabWidget::North);
m_list=this->findChildren<QTabBar*>(QString(), Qt::FindChildrenRecursively);
qDebug() << "size = "<<m_list.size();
if(m_list.size() > 0)
{
qDebug() << "text = "<< m_list[0]->tabText(0);
qDebug() << "text = "<< m_list[0]->tabText(1);
qDebug() << "text = "<< m_list[0]->tabText(2);
}
}
和调试结果:
size = 1
text = "m1"
您提供的少量代码确实只有一个标签栏。 QObject::findChildren()
的选项参数默认设置为 Qt::FindChildrenRecursively
,所以如果你有更多,它会更重要。
一般你有以下几种情况:
- tabbar 包含标签
- 每个选项卡代表一个停靠的小部件