このコードが機能しない理由がわかりません。SIGNAL と SLOT の概念を理解していない可能性があります。
例: という名前のMainWindow
クラスがあり、このクラスには ui コンポーネントが含まれています。この UI では、ローカル サーバーを起動およびシャットダウンできます。このサーバーは class で定義されていますMyServer
。MainWindow
クラスには への参照がありますMyServer class '&myServer'
。クラスmainwindow.cpp
でこれを行うと、動作します:
connect(ui->startServer,SIGNAL(clicked()),&myServer,SLOT(startServer()));
connect(ui->shutdownServer,SIGNAL(clicked()),&myServer,SLOT(shutDownServer()));
しかし、この行はそうではありません:
connect(&myServer,SIGNAL(signalMessage()), this, SLOT(slotUpdate()));
この問題は次のとおりです。void signalMessage();
MyServer クラスで名前が付けられたシグナルがあります。このシグナルは関数で呼び出されvoid startServer();
、void shutDownServer()
signals:
void signalMessage();
通常、クラス内で呼び出した後singalMessage()
、MyServer
クラス内の関数slotUpdate()
を呼び出すMainWindow
必要があります。しかし、 のみsignalMessage()
が呼び出され、 は呼び出されませんslotUpadate()
。
誰かが私の問題を理解してくれることを願っています。MainWindow から MyServer へのスロットとシグナルを定義できますが、逆にすることはできません。:(
編集:わかりました、ここに私の問題を理解するためのいくつかのコードがあります:
メインウィンドウ.h
...
public:
Ui::MainWindow *ui;
MyServer myServer;
public slots:
void slotUpdate();
...
メインウィンドウ.cpp
...
connect(ui->startServer,SIGNAL(clicked()),&myServer,SLOT(startServer()));
connect(ui->shutdownServer,SIGNAL(clicked()),&myServer,SLOT(shutDownServer()));
connect(&myServer,SIGNAL(signalMessage()), this, SLOT(slotUpdate()));
...
void MainWindow::slotUpdate()
{
qDebug()<< "update()";
}
...
myserver.h
public slots:
void startServer();//start the server on 127.0.0.1 port: 1234
void shutDownServer();//disconnect threads, shut down server
signals:
void signalMessage();
myserver.cpp
...
void MyServer::startServer(){
if(!this->listen(QHostAddress::Any,1234)){
message.append("Could not start server, because server is already running");
}else{
message.append("Listening...");
}
emit signalMessage();
}
...
void MyServer::signalMessage()
{
qDebug() << "getMessage()";
}