Có cách nào để tìm cá thể QMetaObject của một lớp không, với tên lớp? những gì tôi muốn làm là để tải các đối tượng từ đĩa, nhưng để điều này xảy ra, tôi cần một cách để lấy một cá thể QMetaObject bằng cách sử dụng tên của một lớp, để sử dụng QMetaObject để tạo một cá thể.Làm thế nào tôi có thể tìm thấy một cá thể metaobt Qt từ một tên lớp?
Trả lời
Bạn có thể lưu trữ các trường hợp metaclass bạn sẽ cần trong một Hash hoặc Bản đồ, và sau đó lấy chúng thông qua bất cứ tên nào bạn lưu trữ chúng dưới
Đối với trường hợp của bạn là giải pháp thích hợp có thể được sử dụng cơ chế Plugin Qt. Nó cung cấp chức năng để dễ dàng tải thư viện chia sẻ/động và kiểm tra xem nó có chứa thực hiện một số giao diện mong muốn hay không, nếu vậy - tạo cá thể. Chi tiết có thể tìm thấy tại đây: How to Create Qt Plugins
Bạn có thể thực hiện việc này với QMetaType. Bạn có thể cần Q_DECLARE_META_TYPE()
và/hoặc qRegisterMetaType()
để làm cho các loại của bạn được biết. Sau đó, nó sẽ hoạt động gần giống như trong ví dụ này từ liên kết:
int id = QMetaType::type("MyClass");
if (id == 0) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
Tôi đã đối mặt với cùng một vấn đề gần đây. Tôi cần metaobject mà không cần phải tạo một thể hiện của chính lớp đó. Tốt nhất tôi có thể làm là tạo ra một hàm toàn cục/tĩnh để lấy qmetaobject cho tên lớp. Tôi đã đạt được điều này bằng cách sử dụng QObject :: staticMetaObject.
QMetaObject GetMetaObjectByClassName(QString strClassName)
{
QMetaObject metaObj;
if (strClassName.compare("MyClass1") == 0)
{
metaObj = MyClass1::staticMetaObject;
}
else if (strClassName.compare("MyClass2") == 0)
{
metaObj = MyClass2::staticMetaObject;
}
else if (strClassName.compare("MyClass3") == 0)
{
metaObj = MyClass3::staticMetaObject;
}
else if (strClassName.compare("MyClass4") == 0)
{
metaObj = MyClass4::staticMetaObject;
}
else if (strClassName.compare("MyClass5") == 0)
{
metaObj = MyClass5::staticMetaObject;
}
// and so on, you get the idea ...
return metaObj;
}
Xem: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var
Nếu ai đó có một lựa chọn tốt hơn, xin vui lòng chia sẻ!
Bạn cũng có thể xem xét các chức năng: QMetaType::metaObjectForType
mà
lợi nhuận QMetaType :: metaObject cho loại
Cập nhật: Đó là mã của tôi, nó tạo ra một lớp theo tên lớp . (Lưu ý rằng các lớp phải được đăng ký với qRegisterMetaType (hoặc là cơ sở QObject)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
Cập nhật 2:. Tôi đã quên nói constructor yout lớp phải được đánh dấu là Q_INVOKABLE
- 1. Lấy tên của lớp từ một cá thể
- 2. SQLAlchemy không thể tìm thấy một tên lớp
- 3. Làm cách nào tôi có thể đặt nơi ứng dụng Qt tìm thấy mô-đun Qt?
- 4. Làm thế nào tôi có thể tìm thấy OWNER của một đối tượng trong Oracle?
- 5. Trong mercurial làm thế nào tôi có thể tìm thấy changesets có chứa một chuỗi?
- 6. Làm thế nào tôi có thể bắt đầu ra từ một con cá chép trong Perl?
- 7. jQuery - làm thế nào tôi có thể tìm thấy nếu một id có một chuỗi cụ thể?
- 8. Trong clojure, làm thế nào tôi có thể undef một var từ một không gian tên?
- 9. Làm thế nào để tạo cá thể mặc định sau khi tạo một cá thể có tên?
- 10. Tôi có thể lưu trữ một cá thể lớp trong một không gian $ _SESSION không?
- 11. VB.NET: Lấy tên lớp của một cá thể
- 12. Trong Java, làm thế nào tôi có thể kiểm tra xem một bộ sưu tập có chứa một cá thể của một lớp cụ thể không?
- 13. Làm thế nào để có được cá thể mô-đun cho một lớp bằng Python?
- 14. Với boto, làm thế nào tôi có thể đặt tên cho một cá thể EC2 mới sinh ra?
- 15. Django: Làm thế nào tôi có thể tìm thấy mô hình nào của tôi đề cập đến một mô hình
- 16. Làm thế nào tôi có thể tìm thấy đường dẫn đến một bao gồm trong Symfony2?
- 17. Làm thế nào tôi có thể tìm thấy số lượng khóa trong một băm trong Perl?
- 18. Làm thế nào tôi có thể tìm thấy màu chủ đạo của một hình ảnh?
- 19. Không thể đọc một const trong một cá thể lớp?
- 20. QT OpenGL QGLWidget không thể tìm thấy
- 21. Cách lấy Tên cá thể từ cá thể trong AWS?
- 22. Làm thế nào tôi có thể tìm thấy tất cả các tên miền giải quyết cho một địa chỉ IP?
- 23. Làm thế nào tôi có thể gọi một phương thức tĩnh từ một lớp nếu tất cả những gì tôi có là một chuỗi tên lớp?
- 24. Làm thế nào tôi có thể thấy những gì capybara được tìm thấy trong một bước dưa chuột thất bại?
- 25. Làm thế nào để lấy một đối tượng ngẫu nhiên từ một cá thể NSSet?
- 26. Tạo một cá thể, tôi đã có loại
- 27. Làm cách nào tôi có thể bắt đầu một cá thể tác vụ tiếp tục?
- 28. Làm thế nào tôi có thể tìm thấy số cột đầu cuối từ một chương trình C/C++?
- 29. Làm thế nào tôi có thể tìm thấy commit nào đã giới thiệu một dòng cụ thể trong git? Hoặc là có một lựa chọn tốt hơn?
- 30. Lấy cá thể lớp theo chuỗi tên lớp