• 8366阅读
  • 4回复

Qt初学者的一点问题!!!! [复制链接]

上一主题 下一主题
离线ztianshan
 

只看楼主 倒序阅读 楼主  发表于: 2007-05-05
— 本帖被 XChinux 执行加亮操作(2007-08-12) —
以下是Qt Assissant(3.2.1)中的Qt Tutorial-Chapter 6 原代码:


#include<qapplication.h>
#include<qpushbutton.h>
#include<qslider.h>
#include<qlcdnumber.h>
#include<qfont.h>
#include<qvbox.h>
#include<qgrid.h>

class LCDRange : public QVBox
{
    public:
        LCDRange(QWidget *parent=0,const char *name=0);

};

LCDRange::LCDRange(QWidget *parent,const char *name)
    :QVBox(parent,name)
{
    QLCDNumber *lcd=new QLCDNumber(2,this,"lcd");
    QSlider *slider=new QSlider(Horizontal,this,"slider");
    slider->setRange(0,99);
    slider->setValue(0);
    connect(slider,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)));
}

class MyWidget : public QVBox
{
    public:
        MyWidget(QWidget *parent=0,const char *name=0);
};

MyWidget::MyWidget(QWidget *parent,const char *name)
    :QVBox(parent,name)
{
    QPushButton *quit=new QPushButton("Quit",this,"quit");
    quit->setFont(QFont("Times",18,QFont::Bold));

    connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));

    QGrid *grid = new QGrid(4,this);

    for(int r=0;r<4;r++)
        for(int c=0;c<4;c++)
            (void)new LCDRange(grid);
}

int main(int argc,char **argv)
{
    QApplication a(argc,argv);

    MyWidget w;
    a.setMainWidget(&w);
    w.show();
    return a.exec();
}


问题:

1:主要是对QGrid类不太理解! Qt的解释好象是说QGrid的对象 可以将其子类按指定的个数 排列出来!
  高手觉得我这个理解对不对??  比如下面的代码:
    QGrid *grid = new QGrid(4,this);

    for(int r=0;r<4;r++)
        for(int c=0;c<4;c++)
            (void)new LCDRange(grid);
  我的理解是:new LCDRange(grid)目的是 将LCDRange的 对象作为grid(QGrid的对象)的子类,这样LCDRange
  的对象就通过grid一每行四个的 格式排列出来!!!
  其中的 :
        for(int r=0;r<4;r++)
        for(int c=0;c<4;c++)
  我感觉其作用就是产生4*4(16)个LCDRange对象 这样grid就会产生4行4列个LCDRange对象
  于是我就用:
            for(int a=0;a<16;a++)
  代替了以上代码!!编译结果完全一样(程序运行结果是一样的,内在是不是一样我就不清楚了!)
  我想问问 我这样做 会不会有潜在的 错误???  我对代码的理解是否有问题??!!!

2:  (void)new LCDRange(grid);  这句中的((void))是什么意思???有什么作用????
    我把((void))删了结果程序还是很正常!!!!((viod))这在C++中是算什么语法??


3:我始终都不能很清楚的理解 子对象和父对象 的用法!!!高手可否指点指点!!书上对这些说得也不多!!!!
  比如说:   
        QLCDNumber *lcd=new QLCDNumber(2,this,"lcd");
    QSlider *slider=new QSlider(Horizontal,this,"slider");
  都在新建对象时用this指针  把自己作为子对象传递给父对象  这样做是为了什么??? 有什么作用吗????
  如果不建父对象有什么影响?????
[ 此贴被XChinux在2007-08-12 22:40重新编辑 ]
离线lophyxp

只看该作者 1楼 发表于: 2007-06-06
1、在
    QGrid *grid = new QGrid(4,this);

    for(int r=0;r<4;r++)
        for(int c=0;c<4;c++)
            (void)new LCDRange(grid);
中,QGrid *grid = new QGrid(4,this);中的(4,this)已经说明了,每行4个Widget。

2、(void)表示强制类型转换,new关键字返回被创建对象的指针,这里将指针转换为空类型,至于为什么要这样转换,我暂时也没有弄懂。

3、新建对象时用this指针  把自己被创建对象指示为子对象,我想可能 是为了方便管理,在QWidget中,有显示对象树状结构的函数。如果这里不指定,会自动用0作为其父对象。

4、不建议再看qt-3的tutorial了,在qt4中,QVBox,QHBox,QGrid这样的对象已经完全被QLayout所取代。再看容易受到误导。
离线mxw5495
只看该作者 2楼 发表于: 2007-06-20
(void)后面加指针是把它转换成一个类型可以通用的指针,可以进行不同类之间的指针赋值,但是使用时要特别小心,要保证能相互赋值才行。
离线margarit
只看该作者 3楼 发表于: 2007-07-16
2. 用void很可能是因为Qt的layout container是保存指定为void的item。就像java的layout就只保存jcomponent。

3. 传this给子widget很多时候是为了call back,比如在子widget上点个button,整个程序关闭,那么就需要子wdget拿住上一层的(最好只是上一层的,或者用mediator pattern)指针,来进行操作。call back的使用,如果使用corba就更明显了。
离线bluesky2010
只看该作者 4楼 发表于: 2010-01-07
原来这样,难怪在QT4.5.1中,QVBox类不识别呢。学习了,谢谢!
快速回复
限100 字节
 
上一个 下一个