c++ Qt“私人老虎机“:这是什么?

vuv7lop3  于 2023-02-26  发布在  其他
关注(0)|答案(4)|浏览(123)

我知道如何使用它,但是它的语法让我很困扰。“private slots:“在做什么?
我从未见过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);

 ...
qnakjoqk

qnakjoqk1#

插槽是C++的Qt特定扩展。它只在通过Qt的预处理器元对象编译器(moc)发送代码后才编译。有关文档,请参阅http://doc.qt.io/qt-5/moc.html
编辑:正如Frank所指出的,moc只在链接时才需要,额外的关键字用标准的预处理器#定义掉了。

5hcedyr0

5hcedyr02#

Qt插槽忽略了publicprivate等关键字,所有插槽实际上都是公共的,可以连接

xxb16uws

xxb16uws3#

声明slot为private意味着你不能像其他方法一样从它们是private的上下文中引用它们,因此你不能将private slot地址传递给connect
如果您将信号声明为private,则表示只有此类可以管理它,但function member pointers do not have access restrictions

class A{
    private:
    void e(){

    }
    public:
    auto getPointer(){
        return &A::e;   
    }
};

int main()
{
    A a;
    auto P=a.getPointer();
    (a.*P)();
}

除此之外,其他回答也是有效的:

  • 你仍然可以连接私人信号和插槽从外面与技巧
  • signalsslots是空宏,不违反语言标准
eaf3rand

eaf3rand4#

如果我们要使用连接机制调用插槽,那么我们将它们声明为公共插槽。
如果我们不打算使用连接机制调用它们,那么我们就不将它们声明为插槽。
如果我们考虑用两种方式调用它们,那么可能是时候进行重构以适应以前的情况了。
我以前也这么想。
在整个Qt文档中,我看到它们都是公共的,但只在一个地方提到了私有插槽
Note: You need to include the QTest header and declare the test functions as private slots so the test framework finds and executes it.

相关问题