1

私はこのコードを持っています:

クラス CMyWindow:

class CMyWindow: public QMainWindow
{ // Q_OBJECT .... here  
private:
    CMyServer *server;
public:
    CMyWindow(QWidget *parent): QMainWindow(parent)
    {
        // Setup GUI here
        server = new CMyServer(this);
        server->startServer();
    }
    void thisChangeLabelCaption(QString str) {
        ui.lblStatus.setText(str);
    }
}

そしてクラス CMyServer:

class CMyServer: public QTcpServer
{       
protected:
    void incomingConnection(int sockDesc) {
        /* Why below line can't be done :-| */
        ((CMyWindow *) parent())->thisChangeLabelCaption("New connection");
    }
}

しかし、incomingConnection() ルーチンの行は実行されていないようです。

この問題の解決策を教えてください。

更新: @vtmarvin が言ったように、私はこの方法を試しました:

class CMyWindow: public QMainWindow
{
private:
    CMyServer *server;
protected slots:
    void editLabel(QString str) {
        thisChangeLabelCaption(str);
    }

public:
    CMyWindow(QWidget *parent): QMainWindow(parent) {
        server = new CMyServer(this);
        server->startServer();
    }

    void thisChangeLabelCaption(QString str) {
        ui.lblStatus.setText(str);
    }
}

class CMyServer: public QTcpServer
{
Q_SIGNAL:
    void setText(QString str);

protected:
    void incomingConnection(int sockDesc) {
        /* Why below line can't be done :-| */
        emit setText("New connection");
    }

public:
    CMyServer(QObject *parent): QTcpServer(parent)
    {
        connect(this, SIGNAL(setText(QString)), parent, SLOT(editLabel(QString)), Qt::QueuedConnection);
    }
}

しかし、より良い結果はありません:-(

4

1 に答える 1

1

メイン スレッド(QMainWindow を所有するスレッド) 以外のスレッドから UI を変更することはできません。CMyServer::incomingConnection は QTcpServer スレッドによって呼び出されると思います。Qt::QueuedConnection タイプでシグナルスロットを実行する必要があります。

于 2012-08-01T09:20:31.593 に答える