我开始学习Qt了.我正在从Visual Studio世界转移,我正在寻找一种使用QMake组织项目结构的方法.我找到了'子目标'模板,但我很难理解它.
我的项目结构如下所示:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Run Code Online (Sandbox Code Playgroud)
我的project.pro看起来像这样
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
Run Code Online (Sandbox Code Playgroud)
在子目录的.pro文件中,我设置了适当的SOURCES,HEADERS和RESOURCES变量.
请告诉我在.pro文件中应该设置的TARGET,TEMPLATE和其他必要值.
另外,还有一些不错的官方QMake教程吗?
我正在将一个中等大小的CRUD应用程序从.Net移植到Qt,我正在寻找一种创建持久化类的模式.在.Net中,我通常使用基本方法(插入,更新,删除,选择)创建抽象持久化类,例如:
public class DAOBase<T>
{
public T GetByPrimaryKey(object primaryKey) {...}
public void DeleteByPrimaryKey(object primaryKey) {...}
public List<T> GetByField(string fieldName, object value) {...}
public void Insert(T dto) {...}
public void Update(T dto) {...}
}
Run Code Online (Sandbox Code Playgroud)
然后,我将其子类化为特定的表/ DTO并添加了DB表布局的属性:
[DBTable("note", "note_id", NpgsqlTypes.NpgsqlDbType.Integer)]
[DbField("note_id", NpgsqlTypes.NpgsqlDbType.Integer, "NoteId")]
[DbField("client_id", NpgsqlTypes.NpgsqlDbType.Integer, "ClientId")]
[DbField("title", NpgsqlTypes.NpgsqlDbType.Text, "Title", "")]
[DbField("body", NpgsqlTypes.NpgsqlDbType.Text, "Body", "")]
[DbField("date_added", NpgsqlTypes.NpgsqlDbType.Date, "DateAdded")]
class NoteDAO : DAOBase<NoteDTO>
{
}
Run Code Online (Sandbox Code Playgroud)
感谢.Net反射系统,我能够实现繁重的代码重用并轻松创建新的ORM.
在Qt中执行此类操作的最简单方法似乎是使用QtSql模块中的模型类.不幸的是,就我而言,它们提供了过于抽象的界面.我至少需要事务支持和控制QSqlTableModel不提供的单个提交.
你能给我一些关于用Qt解决这个问题的提示或者指点一些参考资料吗?
更新:
根据Harald的线索,我实现了一个与上面的.Net类非常相似的解决方案.现在我有两节课.
UniversalDAO继承QObject并使用元类型系统处理QObject DTO:
class UniversalDAO : public QObject
{
Q_OBJECT
public: …Run Code Online (Sandbox Code Playgroud) 我想使用Q_CLASSINFO宏存储一些类信息.但是我想将它包装在我自己的宏中,例如:
#define DB_TABLE( TABLE ) \
Q_CLASSINFO( "db_table", #TABLE )
#define DB_FIELD( PROPERTY, COLUMN ) \
Q_CLASSINFO( "dbcol_" #PROPERTY, #COLUMN )
class Foo : public QObject
{
Q_OBJECT
DB_TABLE( some_table )
DB_FIELD( clientName, client_name )
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,moc不会扩展宏,因此不会添加Q_CLASSINFO.
我已经尝试用已经预处理的源来提供moc,但它在一些包含的Qt类上有效.
你知道任何解决方法吗?