【问题标题】:How to get signals and slots working in Qt?如何让信号和插槽在 Qt 中工作?
【发布时间】:2015-12-29 20:50:14
【问题描述】:

我需要将 StorageSCP 类中的 loadReceivedFiles() 信号链接到 MainController 中的 test() 插槽。

以下代码给了我 3 个错误:

connect(storageSCPWorker->getStorageSCP, &StorageSCP::loadReceivedFiles, this, &MainController::test);

错误 2 错误 C2248: 'QObject::QObject' : 无法访问私有成员 在类 'QObject' c:\users\310214192\documents\visual studio 中声明 2012\projects\Test\Test\storagescp.h 18 1 测试

错误 3 错误 C2248: 'SCP::SCP' : 无法访问私有成员 在类 'SCP' c:\users\310214192\documents\visual studio 中声明 2012\projects\Test\Test\storagescp.h 18 1 测试

错误 1 ​​错误 C3867: 'StorageSCPWorker::getStorageSCP': 函数调用 缺少参数列表;使用“&StorageSCPWorker::getStorageSCP” 创建指向成员 C:\Users\310214192\Documents\Visual Studio 的指针 2012\Projects\Test\Test\maincontroller.cpp 10 1 测试

我怎样才能让它工作?

MainController.cpp:

MainController::MainController()
{
    storageSCPWorkerThread = new QThread();
    storageSCPWorker = new StorageSCPWorker(104, "AE_TEST", 16384, "C:/Test/Received/");
    storageSCPWorker->moveToThread(storageSCPWorkerThread);
    connect(storageSCPWorkerThread, &QThread::started, storageSCPWorker, &StorageSCPWorker::startSCP);
    //connect(storageSCPWorker->getStorageSCP, &StorageSCP::loadReceivedFiles, this, &MainController::test);
    storageSCPWorkerThread->start();
}

void MainController::test()
{
    qDebug() << "HELLO MOTO!!!!";
}

MainController.h:

class MainController : public QObject
{
    Q_OBJECT
public:
    MainController();
    ~MainController();
public slots:
    void test();
private:
    QThread* storageSCPWorkerThread;
    StorageSCPWorker* storageSCPWorker;
};

StorageSCPWorker.cpp:

StorageSCP StorageSCPWorker::getStorageSCP()
{
    return storageSCP;
}

StorageSCPWorker.h:

class StorageSCPWorker : public QObject
{
    Q_OBJECT
public:
    StorageSCPWorker(int port, const OFString &aeTitle, int maxPduLength, const OFString &outputDirectory);
    ~StorageSCPWorker();
    StorageSCP getStorageSCP();
public slots:
        void startSCP();
private:
    int port;
    OFString aeTitle;
    int maxPduLength;
    OFString outputDirectory;
    StorageSCP storageSCP;
    OFCondition status;
};

StorageSCP.cpp:

void StorageSCP::notifyInstanceStored()
{
    emit loadReceivedFiles();
}

StorageSCP.h:

signals:
    void loadReceivedFiles();

【问题讨论】:

  • StorageSCP getStorageSCP(); 您返回成员的副本。这很可能不是您想要的行为。返回 (const) 引用。

标签: c++ qt signals-slots


【解决方案1】:
  • 首先,getStorageSCP() 应该返回一个指针以防止复制对象
  • 第二次连接将指针指向QObject
  • connect的第三、第二个参数必须是signal。由于您有一个notifyInstanceStored 的实现,它显然是一个slot,或一个常规函数。您的意思是将loadReceivedFiles() 连接到test(),而不是notifyInstanceStored() 连接到test()

所以:

你需要更换

StorageSCP StorageSCPWorker::getStorageSCP()
{
    return storageSCP;
}

StorageSCP* StorageSCPWorker::getStorageSCP()
{
    return &storageSCP;
}

然后替换

connect(storageSCPWorker->getStorageSCP, &StorageSCP::notifyInstanceStored, this, &MainController::test);

通过

connect(storageSCPWorker->getStorageSCP(), &StorageSCP::loadReceivedFiles, this, &MainController::test);

或(旧方式,Qt4,但仍在 Qt5 中工作):

connect(storageSCPWorker->getStorageSCP(), SIGNAL(loadReceivedFiles()), this, SLOT(test()));

【讨论】:

  • 好,那么你可以投票,接受答案并继续前进;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多