如何让信号和槽在 Qt 中工作?
How to get signals and slots working in Qt?
我需要 link StorageSCP class 内的 loadReceivedFiles()
信号到 MainController 内的 test()
插槽。
下面的代码给了我 3 个错误:
connect(storageSCPWorker->getStorageSCP, &StorageSCP::loadReceivedFiles, this, &MainController::test);
Error 2 error C2248: 'QObject::QObject' : cannot access private member
declared in class 'QObject' c:\users0214192\documents\visual studio
2012\projects\Test\Test\storagescp.h 18 1 Test
Error 3 error C2248: 'SCP::SCP' : cannot access private member
declared in class 'SCP' c:\users0214192\documents\visual studio
2012\projects\Test\Test\storagescp.h 18 1 Test
Error 1 error C3867: 'StorageSCPWorker::getStorageSCP': function call
missing argument list; use '&StorageSCPWorker::getStorageSCP' to
create a pointer to member C:\Users0214192\Documents\Visual Studio
2012\Projects\Test\Test\maincontroller.cpp 10 1 Test
我怎样才能让它工作?
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();
- 首先,
getStorageSCP()
应该return一个指针来防止复制对象
- 第二次连接将指针指向
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()));
我需要 link StorageSCP class 内的 loadReceivedFiles()
信号到 MainController 内的 test()
插槽。
下面的代码给了我 3 个错误:
connect(storageSCPWorker->getStorageSCP, &StorageSCP::loadReceivedFiles, this, &MainController::test);
Error 2 error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject' c:\users0214192\documents\visual studio 2012\projects\Test\Test\storagescp.h 18 1 Test
Error 3 error C2248: 'SCP::SCP' : cannot access private member declared in class 'SCP' c:\users0214192\documents\visual studio 2012\projects\Test\Test\storagescp.h 18 1 Test
Error 1 error C3867: 'StorageSCPWorker::getStorageSCP': function call missing argument list; use '&StorageSCPWorker::getStorageSCP' to create a pointer to member C:\Users0214192\Documents\Visual Studio 2012\Projects\Test\Test\maincontroller.cpp 10 1 Test
我怎样才能让它工作?
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();
- 首先,
getStorageSCP()
应该return一个指针来防止复制对象 - 第二次连接将指针指向
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()));