PTA-面向对象程序设计实验8:综合-模拟Qt框架

这是一个模拟Qt框架的程序,要求完善各个类的成员函数的定义,并实现测试的输出,具体的要求请看程序中的注释。

函数接口定义:

在这里描述函数接口:
//控件的顶级类
class DQWidget{
protected:
    DQWidget* parent;//父控件指针
public:
    void setParent(DQWidget* p = NULL);
    virtual void show() {}
};

class DQPushButton:public DQWidget{
protected:
    string text;
public:
    void setText(string text);
    void show();
};

//抽象控件
class DQAbstractWidget:public DQWidget{
protected:
    int value; //控件的当前值
    int min;   //控件的最小值
    int max;   //控件的最大值
public:
    void setValue(int value);
    void setRange(int min, int max);;
    void show(); //显示控件的当前值和范围(最小值和最大值)
};

//旋转框
class DQSpinBox : public DQAbstractWidget{
public:
    //显示本控件的类型,并调用父类的show显示值和范围
    void show();
};

//滑杆控件类
class DQSlider : public DQAbstractWidget{
public:
    //显示本控件的类型,并调用父类的show显示值和范围
    void show();
};

//横向布局类
class DQHBoxLayout{
    //布局中共包含N个控件的指针
    DQWidget **cwidgets;
public:
    //构造函数中应对控件数组初始化
    DQHBoxLayout();
    //添加一个控件到布局中
    void addWidget(DQWidget *w);
    //读取布局中的控件数组
    DQWidget **getWidgets();
};

//主窗口类
class DQMainWindow:public DQWidget{
    int width,height;  //主窗口的宽度和高度
    string windowTitle; //窗口标题
    DQHBoxLayout *layout;  //窗口的布局
public:
    DQMainWindow(DQWidget* parent = NULL) {}
    void setWindowTitle(string windowTitle);
    //设置窗口的布局
    void setLayout(DQHBoxLayout *lout);
    //改变窗口的大小
    void resize(int width,int height);
    //显示窗口,包括
    //1. 窗口部件的自身的信息:类型、标题、大小
    //2. 显示窗口中的所有控件
    void show();
};

//Qt应用程序类
class DQApplication{
public:
    DQApplication(int argc, char **argv) {}
    int exec(){return 0;}
};

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
int main(int argc,char** argv)
{
    int mode,min,max,value,width,height;
    cin>>mode>>min>>max>>value>>width>>height;
    //1.创建Qt应用程序对象
    DQApplication app(argc, argv);

    //2.创建主窗口
    DQMainWindow *window = new DQMainWindow;
    window->setWindowTitle("First Qt Application!");
    window->resize(width,height);

    //3.创建Layout,并用来将控件进行布局,这是一个横向布局
    DQHBoxLayout *layout = new DQHBoxLayout;

    DQAbstractWidget *spinBox,*slider;
    DQPushButton *okBtn,*cancelBtn;
    //4.创建窗口中的控件,并设置相应的属性
    switch(mode)
    {
        case 1:
            spinBox = new DQSpinBox;
            spinBox->setRange(min,max);
            spinBox->setValue(value);
            spinBox->show();
            break;
        case 2:
            slider = new DQSlider;
            slider->setRange(min,max);
            slider->setValue(value);
            slider->show();
            break;
        case 3:
            okBtn = new DQPushButton;
            okBtn->setText("OK");
            okBtn->show();
            break;
        default:
            spinBox = new DQSpinBox;
            spinBox->setRange(min,max);
            spinBox->setValue(value);
            slider = new DQSlider;
            slider->setRange(min,max);
            slider->setValue(value);
            okBtn = new DQPushButton;
            okBtn->setText("OK");
            cancelBtn = new DQPushButton;
            cancelBtn->setText("Cancel");
            //5.添加控件到布局里
            layout->addWidget(spinBox);
            layout->addWidget(slider);
            layout->addWidget(okBtn);
            layout->addWidget(cancelBtn);
            //6.设置主窗口的布局
            window->setLayout(layout);

            //7.显示主窗口
            window->show();
    }
    return app.exec();
}


/* 请在这里填写答案 */

输入样例1:

在这里给出一组输入:

1 0 100 30 1024 768

输出样例1:

在这里给出相应的输出。例如:

This is a SpinBox
Value = 30
Range is 0 to 100

/* 请在这里填写答案 */

输入样例2:

在这里给出一组输入:

2 0 100 30 1024 768

输出样例2:

在这里给出相应的输出。例如:

This is a Slider
Value = 30
Range is 0 to 100

输入样例3:

在这里给出一组输入:

4 0 100 30 1024 768

输出样例3:

在这里给出相应的输出。例如:

This is a DQWindow
Title is First Qt Application!
my window's size is(1024,768)
This is a SpinBox
Value = 30
Range is 0 to 100
This is a Slider
Value = 30
Range is 0 to 100
This is a DQPushButton
The text is OK
This is a DQPushButton
The text is Cancel

分析如下: 

如题所说,这只是一个模拟Qt框架的程序,要求完善各个类的成员函数的定义,并实现测试的输出即可。可能很多同学刚刚看到这一堆代码的时候是很懵逼的,不知道从哪下手好,其实并没有我们想的那么复杂,我的思路是:

1、先看main函数里用到了哪些函数来决定我们需要写哪些函数的实现,

2、再根据测试案例结果来决定实现代码如何写。

其中有些知识提前给大家解释:**cwidgets是一个二级指针,和*cwidgets的区别在于指向的不同:

*cwidgets表示cwidgets所指向的地址里面存放的是一个某个类型的值 。

**cwidgets表示cwidgets所指向的地址里面存放的是一个指向某个类型的指针。

具体详解代码如下:

    void  DQWidget:: setParent(DQWidget* p)  //给类的元素赋初值,基操
    {
        parent=p;
    }


    void  DQPushButton::setText(string text)   //给类的元素赋初值,基操
    {
        this->text=text;
    }
    void DQPushButton::show()  
    {
         cout<<"This is a DQPushButton"<<endl;  //写这句是因为测试案例结果,要表明自己的类型
         cout<<"The text is "<<this->text<<endl;
    }

//抽象控件
    void  DQAbstractWidget::setValue(int value)  //给类的元素赋初值,基操
    {
        this->value=value;
    }
    void DQAbstractWidget::setRange(int min, int max)  //给类的元素赋初值,基操
    {
        this->min=min;
        this->max=max;
    }
    void DQAbstractWidget::show()//显示控件的当前值和范围(最小值和最大值)
    {
        cout<<"Value = "<<this->value<<endl;
        cout<<"Range is "<<this->min<<" to "<<this->max<<endl;
    }

//旋转框

    //显示本控件的类型,并调用父类的show显示值和范围
    void  DQSpinBox::show()
    {
        cout<<"This is a SpinBox"<<endl;  //表明自己的类型
        DQAbstractWidget::show();
    }


//滑杆控件类

    //显示本控件的类型,并调用父类的show显示值和范围
    void  DQSlider::show()
    {
        cout<<"This is a Slider"<<endl;  //表明自己的类型
        DQAbstractWidget::show();
    }

//横向布局类
    //布局中共包含N个控件的指针     题中并没有给N赋初值,根据测试案例我们给一个适当大小的就是
    //构造函数中应对控件数组初始化
     DQHBoxLayout::DQHBoxLayout()
    {
        cwidgets=new DQWidget*[10];   //我将N取值10,这是为了用来储存控件
        for(int i=0; i<10;i++)        //先将数组中元素全部置空
        {
            cwidgets[i]=NULL;
        }
    }
    //添加一个控件到布局中
    void  DQHBoxLayout::addWidget(DQWidget *w) //传入的是一个指针,因为cwidgets是一个二级指针,储存每个数组元素就都是指针
    {
        for(int i=0; i<10; i++)
        {
            if(!cwidgets[i])  //先判断,不为空再储存
            {
                cwidgets[i]=w;
                return;
            }
        }
    }
    //读取布局中的控件数组
  DQWidget **DQHBoxLayout::getWidgets()  
    {
        return cwidgets;
    }

//主窗口类
    //DQMainWindow::  DQMainWindow(DQWidget* parent = NULL) {}
    void  DQMainWindow::setWindowTitle(string windowTitle)
    {
        this->windowTitle=windowTitle;
    }
    //设置窗口的布局
    void  DQMainWindow::setLayout(DQHBoxLayout *lout)
    {
        layout=lout;
    }
    //改变窗口的大小
    void DQMainWindow:: resize(int width,int height)
    {
        this->width=width;
        this->height=height;
    }
    //显示窗口,包括
    //1. 窗口部件的自身的信息:类型、标题、大小
    //2. 显示窗口中的所有控件
    void DQMainWindow:: show()
    {                                //先显示自己本身的属性
        cout<<"This is a DQWindow"<<endl;
        cout<<"Title is "<<this->windowTitle<<endl;
        cout<<"my window's size is("<<this->width<<","<<this->height<<")"<<endl;

        //再显示控件属性
        if(layout!=NULL)   //非空的情况下
        {
          DQWidget **cwidgets=layout->getWidgets();  //给二级指针赋值
           for(int i=0; i<10;i++)
         {
           if(cwidgets[i]!=NULL)
            {
                cwidgets[i]->show();
            }
         }
        }
    }

小结一下:

这道题大部分需要写的都不难,稍微有点问题的应该就是**cwidgets这个二级指针,大家记得二级指针指向的是一个指向某个值得指针就好,具体大家再多看看代码解释,应该就问题不大了 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值