标签: signals-slots

Qt是否支持虚拟纯插槽?

我的GUI项目Qt有很多"配置页面"类,它们都直接从中继承QWidget.

最近,我意识到所有这些类共享2个公共插槽(loadSettings()saveSettings()).

对此,我有两个问题:

  • BaseConfigurationPage用这两个插槽作为虚拟纯方法编写一个中间基本抽象类(让它命名)是否有意义?(每个可能的配置页面总是有这两种方法,所以我会说"是")
  • 在我对代码进行大量更改之前(如果必须):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 loadSettings();
    void saveSettings();
};
Run Code Online (Sandbox Code Playgroud)

c++ inheritance qt signals-slots

94
推荐指数
1
解决办法
3万
查看次数

Qt"私人老虎机:"这是什么?

我理解如何使用它,但它的语法困扰我.什么是"私人老虎机"呢?

我以前从未在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);

 ...
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots

73
推荐指数
2
解决办法
4万
查看次数

如何在Qt中发出跨线程信号?

Qt文档指出信号和槽可以是direct,queuedauto.

它还声明,如果拥有插槽的对象'生命'在与拥有信号的对象不同的线程中,则发出此类信号就像发布消息一样 - 信号发出将立即返回,并且将在目标线程的事件循环中调用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 )
    {
        std::cout << "thread 2 started" << std::endl;
        exec();
    }
public slots:
    void MySlot( void )
    {
        std::cout << "slot called" << std::endl;
    } …
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots qt-signals

58
推荐指数
2
解决办法
8万
查看次数

防止Qt中的射击信号

我们有一个QCheckBox对象,当用户检查它或删除检查时我们想要调用一个函数,所以我们将函数连接到stateChanged ( int state )signal.另一方面,根据某些条件,我们还会改变QCheckBox代码内部的对象状态,这会导致不需要的信号.

在某些情况下有没有办法防止发射信号?

c++ checkbox qt signals-slots

52
推荐指数
5
解决办法
4万
查看次数

Qt信号可以返回一个值吗?

Boost.Signals允许使用槽的返回值的各种策略来形成信号的返回值.例如,添加它们,形成vector它们,或返回最后一个.

常见的智慧(在Qt文档中表达[编辑:以及该问题的一些答案])是Qt信号不可能有这样的事情.

但是,当我在以下类定义上运行moc时:

class Object : public QObject {
    Q_OBJECT
public:
    explicit Object( QObject * parent=0 )
        : QObject( parent ) {}

public Q_SLOTS:
    void voidSlot();
    int intSlot();

Q_SIGNALS:
    void voidSignal();
    int intSignal();
};
Run Code Online (Sandbox Code Playgroud)

不仅没有moc抱怨具有非void返回类型的信号,它似乎以允许返回值传递的方式主动实现它:

// SIGNAL 1
int Object::intSignal()
{
    int _t0;
    void *_a[] = { const_cast<void*>(reinterpret_cast<const void*>(&_t0)) };
    QMetaObject::activate(this, &staticMetaObject, 1, _a);
    return _t0;
}
Run Code Online (Sandbox Code Playgroud)

所以:根据文档,这件事是不可能的.那么moc在这做什么?

插槽可以有返回值,那么我们可以将带有返回值的插槽连接到具有返回值的信号吗?毕竟,这可能吗?如果是这样,它有用吗?

编辑:我不是要求解决方法,所以请不要提供任何解决方法.

编辑:它显然在Qt::QueuedConnection模式中没用(QPrintPreviewWidget …

c++ qt return-value signals-slots boost-signals

51
推荐指数
2
解决办法
4万
查看次数

Qt中的C++信号到QML插槽

我想从C++向我的QML文件中的Slot发送一个Signal.我已经让它没有和原始类型参数工作,但如果我想发送QString到我的QML插槽我连接时出错.

我在main.cpp中连接

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));
Run Code Online (Sandbox Code Playgroud)

我的qml文件的相关部分

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}
Run Code Online (Sandbox Code Playgroud)

错误:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
Run Code Online (Sandbox Code Playgroud)

c++ qt signals-slots qml

51
推荐指数
2
解决办法
7万
查看次数

Qt信号和插槽连接两次......会发生什么?

如果相同的信号和插槽连接两次会发生什么?

该机制是如何处理的?

qt signals-slots

49
推荐指数
3
解决办法
1万
查看次数

QT:模板化的Q_OBJECT类

是否有可能有一个模板类,它继承自QObject(并在其声明中有Q_OBJECT宏)?

我想创建像插槽适配器这样的东西,它会做一些事情,但插槽可以采取任意数量的参数(参数的数量取决于模板参数).

我只是尝试这样做,并得到链接器错误.我猜这个模板类没有调用gmake或moc.有没有办法做到这一点?也许通过显式实例化模板?

c++ qt templates signals-slots

40
推荐指数
4
解决办法
2万
查看次数

我应该选择哪个C++信号/插槽库?

我想在不使用QT的项目中使用信号/插槽库.我有很基本的要求:

  1. 使用任意数量的参数连接两个函数.
  2. 信号可以连接到多个插槽.
  3. 手动断开信号/插槽连接.
  4. 不俗的性能 - 应用程序是基于帧的(即不是基于事件的),我想用在每帧中的连接.

我已经阅读了libsigc ++和Boost.Signals之间比较.我还读到Boost.Signals的性能不佳.但是,我知道还有其他库,我仍然不确定应该选择哪个库.

有信号/插槽库的建议吗?

c++ boost signals-slots

37
推荐指数
4
解决办法
2万
查看次数

PySide插槽装饰器是否必要?

我已经看到了一些使用@ QtCore.Slot装饰器的PySide插槽的示例代码,有些则没有.自己测试一下,它似乎没有什么区别.有没有理由我应该或不应该使用它?例如,在以下代码中:

import sys
from PySide import QtCore

# the next line seems to make no difference
@QtCore.Slot()
def a_slot(s):
    print s

class SomeClass(QtCore.QObject):
    happened = QtCore.Signal(str)
    def __init__(self):
        QtCore.QObject.__init__(self)
    def do_signal(self):
        self.happened.emit("Hi.")

sc = SomeClass()
sc.happened.connect(a_slot)
sc.do_signal()
Run Code Online (Sandbox Code Playgroud)

@ QtCore.Slot装饰器没什么区别; 我可以省略它,调用@ QtCore.Slot(str),甚至@ QtCore.Slot(int),它仍然很好地说,"嗨."

PyQt的pyqtSlot似乎也是如此.

python pyqt signals-slots pyside

35
推荐指数
3
解决办法
7968
查看次数