使用QT,新建QWidget工程。
widget.h如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QList>
#include <QDebug>
namespace Ui {
class Widget;
}
class Student {
private:
QString m_name;
public:
QString getName();
void setName(QString name);
};
class StudentDao {
public:
virtual QList<Student> getAllStudents() = 0;
virtual ~StudentDao();
};
class StudentDaoImpl : public StudentDao{ // 可以在该类中添加数据库操作
public:
StudentDaoImpl();
QList<Student> m_students;
virtual QList<Student> getAllStudents();
};
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
StudentDaoImpl *m_studentDaoImpl;
};
#endif // WIDGET_H
widget.cpp如下:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
ui->setupUi(this);
this->m_studentDaoImpl = new StudentDaoImpl();
}
Widget::~Widget() {
delete this->m_studentDaoImpl;
delete this->ui;
}
QString Student::getName() {
return this->m_name;
}
void Student::setName(QString name) {
this->m_name = name;
}
StudentDao::~StudentDao() { }
StudentDaoImpl::StudentDaoImpl() {
Student s1,s2;
s1.setName("John");
s2.setName("Jim");
m_students.append(s1);
m_students.append(s2);
}
QList<Student> StudentDaoImpl::getAllStudents() {
return this->m_students;
}
void Widget::on_pushButton_clicked() {
QList<Student> students;
students = this->m_studentDaoImpl->getAllStudents();
qDebug()<<students.first().getName();
qDebug()<<students[1].getName();
}
main.cpp如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.ui如下:
运行结果如下:
点击PushButton,会打印学生名字。
说明:DAO模式也叫数据访问对象模式。这里将学生的数据封装成Student类,然后将其访问数据的接口抽象为StudentDao基类,而StudentDaoImpl子类继承StudentDao基类,并重写其接口。在StudentDaoImpl类中可以添加数据库操作,这样在Widget中使用StudentDaoImpl时,只使用其接口,而底层StudentDaoImpl中的数据库操作可以不用关心。使用QList容器,可以用于访问多个Student对象。