可以使用QObject类中以下的这些成员函数:
const QObjectList & children () const // type QList < QObject* > QObjectList
或者 QList<T> findChildren ( const QString & name = QString() ) const
或者 QList<T> findChildren ( const QRegExp & regExp ) const
这三个函数都是返回指定容器的子控件,后两个是以名字来查找
我想你的按钮都应该在一个容器里吧,假设在layout1中,你可以这样做
如果layout1中的子控件都是你所需的按钮可以QObjectList theseButtons = layout1->children ();
返回容器的所有对象,你就遍历这个表的QObject* 对象吧
- foreach (QObject* theButtonObject, theseButtons) {
- QPushButton *theButton = qobject_cast<QPushButton *>(theButtonObject); // 别忘了使用qobject_cast转换为button类型
- }
如果不知道foreach关键字,告诉你那个是遍历容器的一个宏,第一个参数是item对象,第二个是容器对象。对item对象进行处理即可
如果layout1中的子控件还包含其它的控件,使用findChildren- QList <QPushButton*> = layout1->findChildren < QPushButton* > (QRegExp ("button\\d"));
然后像上面那样使用foreach逐个处理button吧,这里不用转换类型。
要注意的是,这三个函数都是递归地返回子控件的,即是说只要是子控件都返回,而不是仅仅当前容器层。也就是说,如果以顶层的窗口来使用这三个函数,就会从所有控件中筛选(children()返回所有控件)。如果弄不清楚父容器,也可以直接在顶层窗口对象(假设是theWindow)使用theWindow->findChildren < QPushButton* > (QRegExp ("buttonNum\\d"));不过可能在效率中会稍逊。
详细查看Qt4帮助的
QObject类顺便提一下,不用在ui编辑器中一个个按钮插进去,可以放一个layout对象,然后- int buttonNum = 10;
- for (int i = 0; i < buttonNum; i++) {
- QPushButton* theButton = new QPushButton;
- theButton->setObjectName (QString ("pushbutton%1").arg (i);
- layout->addWidget (theButton); //看你方的layout是什么类型的,如果是grid的还需要行列等参数
- }
你放1000个也行,设置buttonNum=1000。
做个广告:我的开源项目主页是diaryblog.sourceforge.net,一个离线的内容管理器。
另,有一点误会你的意思了,你是说其中几个??,也是用上面的方法(findChildren),只是查找条件要改一改。最好你的按钮名字也要改改,将你要设置特效的那几个按钮设为稍有不同的名字,如button_texiao_0 ~ button_texiao_3,用findChildren (QRegExp ("button_texiao_\\d"))把这几个查找。如果分组的也可以,如三个是翻转的,三个是爆炸的,四个是跳舞的可以分别是button_fanzhuan_0~button_fanzhuan2,button_baozha0~button_baozha2,button_tiaowu0~button_tiaowu3,分别以不同的条件找到他。还有什么问题吗??
再另,如果你想把所有按钮找到后使用
来实现(QList确实提供这个操作符),我劝你还是别这样做。因为返回按钮的顺序不一定和你预期的一样,顺序是当时你插入的顺序,如果当时你就不是从左到右,或者从右到左的话,而是梅花间竹的放,那就不要说我没说。
再再另,也可以不用上面所说的QObject的findChildren,可以使用QLayout类中的itemAt ()函数,但前提是你的这些按钮必须是放在一个layout容器中。
- for (int i = buttonNum; i < 10; i++) {
- QPushButton* theButton = qobject_cast < QPushButton* > (layout->itemAt (i)->widget ()); //如果layout是grid的,则使用itemAtPosition (row, col)
- }
这个就不用考虑顺序的问题了。
[ 此帖被seekawayout在2010-02-07 03:39重新编辑 ]