Đây là một cảnh quay dài nhưng đã gặp phải một hạn chế dưới dạng tín hiệu của qt, các khe không thể được templatized, tôi chỉ nghĩ đến việc thay thế chúng bằng tín hiệu tăng, là lựa chọn khả thi?sử dụng tín hiệu tăng thay vì qt
Trả lời
Bạn không bị buộc phải sử dụng tín hiệu và vị trí của qt. Từ Using Qt with 3rd Party Signals and Slots:
Có thể sử dụng Qt với cơ chế tín hiệu/khe của bên thứ ba. Bạn thậm chí có thể sử dụng cả hai cơ chế trong cùng một dự án. Chỉ cần thêm dòng sau vào tệp dự án qmake (.pro) của bạn.
CONFIG += no_keywords
Nó nói với Qt không để xác định từ khóa moc tín hiệu, khe, và phát ra, vì các tên này sẽ được sử dụng bởi một thư viện của bên thứ 3, ví dụ Tăng cường. Sau đó, để tiếp tục sử dụng tín hiệu và vị trí Qt với cờ no_keywords, chỉ cần thay thế tất cả các từ khóa Qt moc trong nguồn của bạn bằng các macro Qt tương ứng Q_SIGNALS (hoặc Q_SIGNAL), Q_SLOTS (hoặc Q_SLOT) và Q_EMIT.
Có một complete explanation cách kết nối tín hiệu tăng cường với tín hiệu qt.
tôi thấy bộ chuyển đổi này ở đâu đó trên mạng, nhưng không có ý tưởng đó:
#ifndef _QT_2_FUNC_3_H_
#define _QT_2_FUNC_3_H_
#include <iostream>
#include <boost/function.hpp>
#include <boost/type_traits.hpp>
#include <QObject>
#include <libQtSignalAdapters/QtConnDefault.h>
using namespace boost;
namespace QtSignalAdapters
{
/**
* \cond
*/
template<typename SIGNATURE>
class Qt2FuncSlot3
{
public:
typedef function<SIGNATURE> FuncType;
typedef typename function_traits<SIGNATURE>::arg1_type ParmType1;
typedef typename function_traits<SIGNATURE>::arg2_type ParmType2;
typedef typename function_traits<SIGNATURE>::arg3_type ParmType3;
Qt2FuncSlot3(const FuncType& func) :
func_(func)
{
}
void call(QObject* sender, void **arguments)
{
ParmType1* a1 = reinterpret_cast<ParmType1*>(arguments[1]);
ParmType2* a2 = reinterpret_cast<ParmType2*>(arguments[2]);
ParmType3* a3 = reinterpret_cast<ParmType3*>(arguments[3]);
if (func_)
func_(*a1,*a2, *a3);
}
private:
FuncType func_;
};
/**
* \endcond
*/
template<typename SIGNATURE>
class Qt2Func3 : public QObject, public QtConnDefault
{
public:
typedef function<SIGNATURE> FuncType;
typedef typename function_traits<SIGNATURE>::arg1_type ParmType;
Qt2Func3(QObject* qobject, int signalIdx, const FuncType& func,
bool initiallyConnected=true) :
QObject(qobject),
QtConnDefault(qobject, signalIdx),
func_(func)
{
//
// Get the next usable slot ID on this...
//
slotIdx_ = metaObject()->methodCount();
//
// Create a slot to handle invoking the boost::function object.
//
slot_ = new Qt2FuncSlot3<SIGNATURE>(func);
if (initiallyConnected)
connect();
}
~Qt2Func3()
{
delete slot_;
}
int qt_metacall(QMetaObject::Call c, int id, void **arguments)
{
id = QObject::qt_metacall(c, id, arguments);
if (id < 0 || c != QMetaObject::InvokeMetaMethod)
return id;
slot_->call(sender(), arguments);
return -1;
}
void connect()
{
connect_();
}
void disconnect()
{
disconnect_();
}
private:
void connect_()
{
connected_ =
QMetaObject::connect(qobject_, signalIdx_, this, slotIdx_);
}
void disconnect_()
{
connected_ =
!QMetaObject::disconnect(qobject_, signalIdx_, this, slotIdx_);
}
FuncType func_;
Qt2FuncSlot3<SIGNATURE>* slot_;
};
}
#endif
Vì vậy, về cơ bản bạn phải reimplement qt_metacall
chức năng.
Qt 5 hỗ trợ kết nối tín hiệu với các chức năng tùy ý ra khỏi hộp - xem http://qt-project.org/wiki/New_Signal_Slot_Syntax Đối với Qt 4, có một vài thư viện bộ điều hợp. Nỗ lực của tôi tại liên kết này cộng với những người khác có thể được tìm thấy tại https://github.com/robertknight/qt-signal-tools –
@RobertKnight Phải là câu trả lời (một câu trả lời hay, nếu bạn hỏi tôi). btw finaly họ đã đưa ra quyết định tốt về tín hiệu/khe của họ –
Quyết định rất tốt, quả thật vậy. Cuối cùng mương moc (* vua *)! –
- 1. Qt sử dụng tăng :: shared_ptr trong tín hiệu/khe
- 2. Sử dụng Boost.Signal thay vì tín hiệu của Qt? Làm mà không có moc?
- 3. Cách sử dụng enums trong tín hiệu và khe Qt
- 4. Tín hiệu Qt & câu hỏi thừa kế
- 5. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 6. Tín hiệu Qt (QueuedConnection và DirectConnection)
- 7. tín hiệu qt undefined reference error
- 8. Qt QNetworkAccessManager không phát ra tín hiệu
- 9. Sử dụng tín hiệu Qt và các khe có nhiều thừa kế
- 10. Trực quan hóa Tín hiệu và Slots QT
- 11. Sử dụng tín hiệu Pre_delete trong django
- 12. tín hiệu django, cách sử dụng "instance"
- 13. Gửi tín hiệu từ phương thức lớp tĩnh trong Qt
- 14. Qt buộc QCheckBox phát ra tín hiệu trên setChecked
- 15. Qt thực hiện tín hiệu và khe như thế nào?
- 16. Connect QML tín hiệu C++ 11 khe lambda (Qt 5)
- 17. Gỡ lỗi tín hiệu Qt, khe và kết nối
- 18. Nhận tín hiệu: Sử dụng chức năng thành viên làm bộ xử lý tín hiệu
- 19. phát ra std :: chuỗi với tín hiệu qt
- 20. Tín hiệu Qt và Slots đối tượng ngắt kết nối?
- 21. Tín hiệu C++ vào khe QML trong Qt
- 22. numpy.nextafter decrementing thay vì tăng
- 23. Tôi có nên sử dụng cơ chế tín hiệu/khe Qt qua các cuộc gọi lại truyền thống không?
- 24. Sử dụng phát ra vs gọi một tín hiệu như thể đó là một chức năng thường xuyên trong Qt
- 25. áp dụng các chức năng python trực tiếp cho thiết kế Qt làm tín hiệu
- 26. lỗi: git-credential-osxkeychain đã chết vì tín hiệu 11
- 27. Kết nối với QNetworkReply :: tín hiệu lỗi
- 28. Trạng thái tín hiệu và không có tín hiệu
- 29. Bất kỳ ý tưởng nào để chạy tín hiệu/khe Qt qua mạng?
- 30. Bạn có sử dụng std :: shared_ptr <std::vector> thay vì tăng :: shared_array không?
Làm cách nào chúng tôi biết? Nói chung có, hoàn toàn không có gì sai với Boost.Signals, nhưng nó tùy thuộc vào bạn để quyết định nếu Boost là đúng cho vấn đề cụ thể của bạn. –