• 6926阅读
  • 5回复

QT的控件枚举问题 [复制链接]

上一主题 下一主题
离线athrun
 
只看楼主 正序阅读 楼主  发表于: 2009-11-10
请问在QT的窗口(MainWindow)下,可以枚举该窗口的所有控件吗?如果可以的话,该怎么做?请各位高手赐教。谢谢
离线foxyz

只看该作者 5楼 发表于: 2009-11-10
没这么复杂! 楼主得去看看c++的类的继承和多态
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();  
你会获得一个list,然后你就操作这个list就ok.
你可以这么用:
for(int i=0;i<allPButtons.size();++i)
{
    QPushButton *bt = allPButtons.at(i);
    bt->setText("Ok");
    ....
}

如果楼主要用类似java的迭代遍历,要这么写:

QListIterator<QPushButton*> it(allPButtons);   //这里模版参数是QPushButton类指针,而不是QPushButton类
while(it.hasNext()){
        QPushButton *bt= it.next();
        bt->setText(tr("aaa"));
}
[ 此帖被foxyz在2009-11-10 16:46重新编辑 ]
离线athrun
只看该作者 4楼 发表于: 2009-11-10
OK,我搞定喽。原来是要依次子类化对象的。就是从最开始QObject  -> QAbstractButton -> QPushButton 才可以的。
谢谢 foxyz; 非常感谢。项目完成之后我会抽取部分功能写作实例提交的。
离线athrun
只看该作者 3楼 发表于: 2009-11-10
谢谢楼上foxyz的回复,我也使用了 QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();  这种方法,只是我使用迭代器的时候,实例化错误。郁闷。
我的部分代码如下:
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();  
QListIterator<QPushButton> it(allPButtons);
QObject *obj;
while(it.hasNext()){
       obj = it.netx();
      ((QPushButton *)obj)->setText(tr("aaa")); //这样就出错了提示对象不能覆盖。
}

迭代器如何转化为实际对象来使用的?
[ 此帖被athrun在2009-11-10 12:58重新编辑 ]
离线foxyz

只看该作者 2楼 发表于: 2009-11-10
这个我测试过,对于一个复杂的界面,需要一个递归函数.差不多如下:
void printChild(QObject* parent)
{
    QObjectList children = parent->children();
    if(children.size() == 0)
    {
        QMetaObject *mobj = parent->metaObject();
        qDebug()<<"class name is "<<mobj->className()<<"obj name is "<<parent->objectName();
    }
    else
    {
        for(int i=0;i<children.size();++i)
        {
            printChild(children);
        }
}

如果你想处理所有你已知的子控件,最好使用
QList<T> QObject::findChildren ( const QString & name = QString() ) const
for example:
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
离线athrun
只看该作者 1楼 发表于: 2009-11-10
自己顶一下。希望高手提点提点。
快速回复
限100 字节
 
上一个 下一个