• 8022阅读
  • 17回复

QTabBar标签栏里的单个标签是什么类? [复制链接]

上一主题 下一主题
离线iiiyyyhhhsss
 

只看楼主 倒序阅读 楼主  发表于: 2009-10-18
对于QTabBar里的一个标签,我想知道是什么类?

我觉得最有可能是QLabel,

但我通过findChildren()肯定了它不是QWidget的子类

所以觉得很奇怪。。。

大家有知道的吗?
[ 此帖被iiiyyyhhhsss在2009-10-18 22:21重新编辑 ]
离线rqzrqh

只看该作者 1楼 发表于: 2009-10-18
你去设计器里面的属性栏找,部件如果是由其他部件组成,有可能会在属性里找到。
比如QTableWidget的表头,在设计器的最下方有很多都是关于表头的属性。
离线iiiyyyhhhsss

只看该作者 2楼 发表于: 2009-10-18
刚找过了,没感觉有相关的
离线rqzrqh

只看该作者 3楼 发表于: 2009-10-19
对于setTabText(int index, const QString &text)
先去tabList中获得index所在的QTabBar的私有数据类QTabBarPrivate中结构体tab的指针,然后设置tab->text = text,再刷新。
因为QTabBarPrivate是QTabBar自身的私有数据,而且这个是从QWidgetPrivate继承过来的,并不是从某个标签私有数据类继承过来的,因此可以判断这个text是QTabBar自身的。
离线iiiyyyhhhsss

只看该作者 4楼 发表于: 2009-10-19
获得结构体tab的指针?Qt里有这种结构体吗?

但首先要知道这个指针的类型啊?这个类型不知道,如何获得它的指针?
离线iiiyyyhhhsss

只看该作者 5楼 发表于: 2009-10-19
我在QTabBar.cpp源代码里找到这个函数,
首先第一句我读不明白,是什么意思呢?Q_D是什么函数,我找来找去都找不到它的定义
然后QTabBarPrivate是一个什么类?怎么在demo里搜索不到呢?
void QTabBar::setTabText(int index, const QString &text)
{
    Q_D(QTabBar);
    if (QTabBarPrivate::Tab *tab = d->at(index)) {
        tab->text = text;
#ifndef QT_NO_SHORTCUT
        releaseShortcut(tab->shortcutId);
        tab->shortcutId = grabShortcut(QKeySequence::mnemonic(text));
        setShortcutEnabled(tab->shortcutId, tab->enabled);
#endif
        d->refresh();
    }
}
离线rqzrqh

只看该作者 6楼 发表于: 2009-10-19
茫茫多的宏~~~
具体可以去看网上资料inside qt
离线iiiyyyhhhsss

只看该作者 7楼 发表于: 2009-10-19
你刚才说的那个tabList是哪个类里的成员?

我如何获得一个tabBar的tabList?
离线iiiyyyhhhsss

只看该作者 8楼 发表于: 2009-10-19
还有我想问问,d->at(index)的这个d是什么类型?

我找遍了qtabbar.cpp和qtabbar.h都找不到这个d的声明或是定义
离线rqzrqh

只看该作者 9楼 发表于: 2009-10-19
d是指向QTabBar的指针,你看不到得。是通过一个宏QDECLARE_PRIVATE(QTabBar)转换的获得的,具体定义在corelib下的globle.h里面
离线iiiyyyhhhsss

只看该作者 10楼 发表于: 2009-10-19
是吗?但是QTabBar没有at()这个成员函数啊
离线rqzrqh

只看该作者 11楼 发表于: 2009-10-19
是d->at()。d是指向QTabBarPrivate的指针
离线iiiyyyhhhsss

只看该作者 12楼 发表于: 2009-10-19
那么,

用什么办法可以获得一个QTabBar的QTabBarPrivate的指针呢?
[ 此帖被iiiyyyhhhsss在2009-10-19 13:39重新编辑 ]
离线iiiyyyhhhsss

只看该作者 13楼 发表于: 2009-10-19
研究了一整天,还是不知道标签栏里的单个标签是什么来的?毫无头绪
离线rqzrqh

只看该作者 14楼 发表于: 2009-10-19
不能获得,因为是私有的。当然,也可以有方法获得。
离线iiiyyyhhhsss

只看该作者 15楼 发表于: 2009-10-19
那是什么方法呢?
离线rqzrqh

只看该作者 16楼 发表于: 2009-10-19
引用linux源码中的一个宏
#define list_entry(ptr, type, member) \
        (   (type *)( (char *)(ptr)   -   (unsigned long) (&(type *)0)->member  )  )  )
上面是一种通过成员数据的地址获得类的地址或者结构体的地址
也可以用类似方法通过头指针加上该数据类型在类中的偏移就可以获得该私有类似变量的地址了
离线rqzrqh

只看该作者 17楼 发表于: 2009-10-19
上面的方法只适合获得的一个私有成员变量的指针,C++类的内存布局比较复杂,C里面的方法不适合C++
[ 此帖被rqzrqh在2009-10-20 17:46重新编辑 ]
快速回复
限100 字节
 
上一个 下一个