这是一个模拟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这个二级指针,大家记得二级指针指向的是一个指向某个值得指针就好,具体大家再多看看代码解释,应该就问题不大了