Qt 中关于QTabWidget的理解

QTabWidget与QTabBar

    QTabWidget 并不等于QTabBar,如下图所示,蓝色部分是QTabBar,黄色部分是QTabWidget

    QTabWidget在创建后,自动内部创建一个QTabBar。QTabBar只是用来维护上方的每一个Tab,并进行相应的消息交流。

    QTabWidget为每一个Tab用以下俩个函数中的一个:
    int addTab(QWidget *page, const QString &label)
    int addTab(QWidget *page, const QIcon &icon, const QString &label)

     这俩个函数为新的Tab联系起来一个显示的界面,同时根据QTabBar里那个Tab被点选择显示哪个QWidget,同时QWidget与 QTabBar父窗口都是 QTabWidget,当QTabWidget销毁时,释放对他们的内存。

Qt 中关于QTabWidget的理解_第1张图片

可视化设计遇到的问题

       那么问题来了,在Designer中可视化设计时,如图红色所示,每当我们创建一个page时,会自动生成一个QWidget在QTabWidget中,而我们放入别的控件在QWidget中。 

       那当我们要编写一个很聪明的软件时,比如每个新创建的Tab都要显示一个TableView并且可以是动态用户选择创建几个Tab时,这时我们内部用一个List管理肯定方便,减少了代码的冗余。但此时问题来了,我们用QTabWidget的QWidget * widget(int index) const 获得的是QWidget,而不是我们放在QWidget上的QTableView,怎么办? 有人肯定觉着用Promote提拔QWidget 成为QTableView不就可以了?

Qt 中关于QTabWidget的理解_第2张图片

       然而很遗憾,QTableView属于Designer里的控件,并没办法提拔,但每次可视化设计QTabWidget又自动给你加入QWidget,很无奈,不过我们可以获得了Widget后再用。

QWidget *childAt(int x, int y) const 

QWidget *childAt(const QPoint &p) const

调用子窗口,这不是一个很好的办法,因为我们需要提供子控件的位置。

       千万不要想着用(已经获得的Widget的指针)->(放在他上头的TableView的指针)。因为在可视化设计中,所有的控件他们可能彼此有复杂的父子关系,但他们的定义都在ui_widget中。哪怕TableView放在Widget上,他们只是父子关系,并不是TableView的实例定义在定义在这个Widget里。如下图所示: 

Qt 中关于QTabWidget的理解_第3张图片

总结

       这就是可视化设计的一部分局限性,任何事物都有它的两面性,而我们要做的就是仔细钻研,了解事物的运行机制,可能这样开始很浪费时间,但它能帮助你真正走向行业的巅峰。以上本人愚见,在此大家共勉。 

你可能感兴趣的:(qt,qt,gui)