我想在不使用QT的项目中使用信号/插槽库。 我有相当基本的要求: 用任意数量的参数连接两个函数。 信号可以连接到多个插槽。 手动断开信号/插槽连接。 体面的性能 – 应用程序是基于帧(即不基于事件),我想在每个帧中使用连接。 我已经阅读了libsigc ++和Boost.Signals之间的比较 。 我也读过Boost.Signals的糟糕performance。 但是,我知道还有其他的库,我还不确定应该select哪个库。 有信号/插槽库的build议吗?
如果相同的信号和插槽连接两次会发生什么? 机制如何处理?
我们有一个QCheckBox对象,当用户检查它或删除检查我们要调用一个函数,所以我们把我们的函数连接到stateChanged ( int state )信号。 另一方面,根据一些条件,我们也改变了QCheckBox对象内部代码的状态,这就造成了不需要的信号。 有什么办法可以防止在某些情况下发射信号?
我明白如何使用它,但它的语法困扰我。 什么是“私人插槽”? 我从来没有见过private关键字和:之前的类定义之间的东西。 在这里有一些奇特的C ++魔法吗? 例如: #include <QObject> class Counter : public QObject { Q_OBJECT public: Counter() { m_value = 0; } int value() const { return m_value; } public slots: void setValue(int value); …
Qt文档指出信号和插槽可以是direct , queued和auto 。 它还指出,如果拥有插槽的对象“生活”在一个与拥有信号的对象不同的线程中,发送这样的信号就像是发送消息 – 信号发送将立即返回,在目标线程的事件循环中将调用slot方法。 不幸的是,文档没有说明“生命”是什么,也没有可用的例子。 我已经尝试了下面的代码: main.h: class CThread1 : public QThread { Q_OBJECT public: void run( void ) { msleep( 200 ); std::cout << "thread 1 started" << std::endl; MySignal(); exec(); } signals: void MySignal( void ); }; class CThread2 : public QThread { Q_OBJECT public: void run( void ) { […]
我在Qt中的GUI项目有很多“configuration页面”类,它们都直接从QWidgetinheritance。 最近,我意识到所有这些类共享2个公共时隙( loadSettings()和saveSettings() )。 对此,我有两个问题: 用这两个插槽编写一个中间基本抽象类(让它命名为BaseConfigurationPage )是否是有意义的虚拟纯方法? (每个可能的configuration页面将总是有这两个方法,所以我会说“是”) 在我做我的代码的重大变化之前(如果我必须):Qt是否支持虚拟纯插槽? 有什么我应该知道的? 这是一个描述一切的代码示例: class BaseConfigurationPage : public QWidget { // Some constructor and other methods, irrelevant here. public slots: virtual void loadSettings() = 0; virtual void saveSettings() = 0; }; class GeneralConfigurationPage : public BaseConfigurationPage { // Some constructor and other methods, irrelevant here. public slots: void […]
我想发送一个信号从C ++到我的QML文件中的一个槽。 我已经得到它没有和原始types参数工作,但如果我想发送一个QString到我的QML插槽,我会在连接时出错。 我在main.cpp连接 QObject *contentView = rootObject->findChild<QObject*>(QString("contentView")); QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)), contentView, SLOT(updateViewWithItem(QString))); 我的qml文件的相关部分 Rectangle { objectName: "contentView" function updateViewWithItem(string) { console.log('got some Items'); } // slot } 错误: Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
我有以下代码执行后台操作( scan_value ),同时更新ui( progress )中的进度条。 scan_value迭代obj某个值,每当该值发生变化时都会发出一个信号( value_changed )。 由于在这里不相关的原因,我不得不把它包装在另一个线程中的对象( Scanner )。 扫描器在clickedbuttonscan时被调用。 这里是我的问题…下面的代码工作正常(即进度条按时更新)。 # I am copying only the relevant code here. def update_progress_bar(new, old): fraction = (new – start) / (stop – start) progress.setValue(fraction * 100) obj.value_changed.connect(update_progress_bar) class Scanner(QObject): def scan(self): scan_value(start, stop, step) progress.setValue(100) thread = QThread() scanner = Scanner() scanner.moveToThread(thread) thread.start() scan.clicked.connect(scanner.scan) […]