• 5279阅读
  • 2回复

关于QT循环的一个问题,急等,谢谢,大大,们 [复制链接]

上一主题 下一主题
离线anjing186
 
只看楼主 倒序阅读 楼主  发表于: 2010-02-05
— 本帖被 XChinux 从 Qt新闻馆 移动到本区(2010-02-08) —
我想问一个问题,那就是 我现在用UI编辑器做了10来个按钮,命名分别为pushbutton0 - pushbutton9,然后会自动生成一个。h的文件,在文件里会自动生成一堆的pushbutton0-pushbutton9的指针,

然后我想在我的程序用设置这些按钮的特效,例如我m_InputUI->pushbutton0.setXXXX,但是 我想用这样的样子写,不想一下写 10几个按钮的设置,因为这10哥按钮有几个设置时一样的,我想这样:
for (int buttonNum; buttonNum < 10; buttonNum ++)
{
    m_InputUI->pushbuttoni.setXXXX;
}

本来我想用pushbutton数组的样式解决的,可惜,自动编辑器UI不认识这玩意,命名不可以带【】,希望那个各位大大帮忙一下,谢谢。。。

这个样子实现,不知道可有什么办法,C++我可以直接用sprintf,QT里用什么?
离线seekawayout

只看该作者 1楼 发表于: 2010-02-07
可以使用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* 对象吧
  1. foreach (QObject* theButtonObject, theseButtons) {
  2.   QPushButton *theButton = qobject_cast<QPushButton *>(theButtonObject); // 别忘了使用qobject_cast转换为button类型
  3. }
如果不知道foreach关键字,告诉你那个是遍历容器的一个宏,第一个参数是item对象,第二个是容器对象。对item对象进行处理即可

如果layout1中的子控件还包含其它的控件,使用findChildren
  1. QList <QPushButton*> = layout1->findChildren < QPushButton* > (QRegExp ("button\\d"));
然后像上面那样使用foreach逐个处理button吧,这里不用转换类型。
要注意的是,这三个函数都是递归地返回子控件的,即是说只要是子控件都返回,而不是仅仅当前容器层。也就是说,如果以顶层的窗口来使用这三个函数,就会从所有控件中筛选(children()返回所有控件)。如果弄不清楚父容器,也可以直接在顶层窗口对象(假设是theWindow)使用theWindow->findChildren < QPushButton* > (QRegExp ("buttonNum\\d"));不过可能在效率中会稍逊。
详细查看Qt4帮助的QObject类

顺便提一下,不用在ui编辑器中一个个按钮插进去,可以放一个layout对象,然后
  1. int buttonNum = 10;
  2. for (int i = 0; i < buttonNum; i++) {
  3.   QPushButton* theButton = new QPushButton;
  4.   theButton->setObjectName (QString ("pushbutton%1").arg (i);
  5.   layout->addWidget (theButton); //看你方的layout是什么类型的,如果是grid的还需要行列等参数
  6. }
你放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,分别以不同的条件找到他。还有什么问题吗??

再另,如果你想把所有按钮找到后使用
  1. theseButton[i]
来实现(QList确实提供这个操作符),我劝你还是别这样做。因为返回按钮的顺序不一定和你预期的一样,顺序是当时你插入的顺序,如果当时你就不是从左到右,或者从右到左的话,而是梅花间竹的放,那就不要说我没说。

再再另,也可以不用上面所说的QObject的findChildren,可以使用QLayout类中的itemAt ()函数,但前提是你的这些按钮必须是放在一个layout容器中。
  1. for (int i = buttonNum; i < 10; i++) {
  2.   QPushButton* theButton = qobject_cast < QPushButton* > (layout->itemAt (i)->widget ()); //如果layout是grid的,则使用itemAtPosition (row, col)
  3. }
这个就不用考虑顺序的问题了。
[ 此帖被seekawayout在2010-02-07 03:39重新编辑 ]
离线seekawayout

只看该作者 2楼 发表于: 2010-02-07
不知道你所说特效指的是什么,是按钮的外貌风格,颜色,边框等???如果是的话可以使用styleSheet。和css的差不多。详细看帮助,每种widget都有这个属性。
如果你的按钮在一个QWidget容器中可以这样写,假设容器名为widget1
#pushbutton1,
#pushbutton2,
#pushbutton3 {
  background-color: red;
  border: 1px solid blue;
}
像这样子
更正一下,也可以通过styleSheet修改属性,用qproperty-属性:属性值完成
#pushbutton1,
#pushbutton2,
#pushbutton3 {
  qproperty-flat: true;
}
设置指定按钮的flat属性为true

上面的是明确指定几个按钮设置,如果是一个容器中(假设为widget1)所有按钮的可以这样
#widget1 .QPushButton {
...
}

.QPushButton前面的'.'是为了排除QPushButton可能的子类。
[ 此帖被seekawayout在2010-02-07 15:29重新编辑 ]
快速回复
限100 字节
 
上一个 下一个