我在C ++项目中使用Qt库但我有一个设计问题:应该在哪里声明数据库?我宁愿不申报全局变量。
目前我正在以这种方式解决这个问题。我有一个主窗口,我在那里声明了DB,所以我在主窗口中执行查询,并使用不同的信号和插槽将结果传递给对话框。
我在主窗口启动时启动数据库,在窗口关闭时关闭它。我不知道这是否可以 现在我需要另一个类中的数据库连接,所以我可以传递对数据库的引用或使数据库全局
我不喜欢这些解决方案..是否有处理这种情况的标准模式?
编辑:
我的班级现在看起来像:
class Database
{
public:
bool open(void);
bool close(void);
static Database* getDatabase(void);
// various methods like loadThisTable(), saveThisTable() etc
private:
Database(); // disable constructor
~Database(); // disable destructor
Database(const Database&); // disable copy constructor
Database& operator=(const Database&); // disable assignment
static Database* instance_; // database instance
QSqlDatabase qtDB; // qt db database
}
如果我想要,我可以添加添加和删除方法,但我有一个数据库实例。
答案 0 :(得分:2)
如果您正在使用QSqlDatabase
,则实际上并不需要将其设为全局变量。只需在首次启动应用程序时设置连接,然后使用static QSqlDatabase
方法在不同模块中需要时访问连接。
示例强>
QSqlDatabase db; // set up the default connection
// alternative: set up a named connection
// QSqlDatabase db("conn-name");
// set the connection params and open the connection
// ... later on
QSqlDatabase db = QSqlDatabase::database(); // retrieve the default connection
// alternative: retrieve the named connection
// QSqlDatabase db = QSqlDatabase::database("conn-name");
来自the docs:
QSqlDatabase
是一个值类。通过QSqlDatabase
的一个实例对数据库连接所做的更改将影响表示同一连接的QSqlDatabase
的其他实例。使用cloneDatabase()
根据现有数据库连接创建独立的数据库连接。
注意:如果您的应用程序是多线程的,则必须小心只在创建它的线程中使用连接。
答案 1 :(得分:0)
您需要singleton
模式。它是一个只有一个实例的全局类。有人称它为反模式(有时它是),但它是处理数据库连接等资源的最佳方式。
并且不要忘记您可以使用QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]
方法按名称获取QSqlDatabase
实例(名称可以通过QSqlDatabase QSqlDatabase::addDatabase ( QSqlDriver * driver, const QString & connectionName = QLatin1String( defaultConnection ) ) [static]
方法设置)以避免仅为存储QSqlDatabase
个实例。