4

これと同様の質問が寄せられていることは知っていますが、問題を解決する答えが見つかりません。

私の会社が使用するプログラムにサーバー機能を追加するために、いくつかの既存の Qt コードを適応させています。そのために、QTcpServer オブジェクトを既存のダイアログに追加し、listen() を呼び出して、次のようにスロットを newConnection エミッターに接続します。

    .h
    class QConsole : public QDialog
    {
    Q_OBJECT
    public:
        void init();
    public slots:
        void new_Connection();
    private:
        QTcpServer m_Server;
    }

    .cpp
    void QConsole::init()
    {
        m_Server.listen(QHostAddress::Any, 12346);
        QDialog::connect(&m_Server, SIGNAL(newConnection()), this, SLOT(new_Connection()));
    }

主なものは次のとおりです。

    int main( int argc, char *argv[] )
    {
        QApplication app(argc, argv);
        QConsole * _output_window = new QConsole(desktopRect);
        _output_window->init();
        _output_window->show();

    return app.exec();
    }

new_Connection() は呼び出されないため、関連性はわかりませんが、次のとおりです。

   void QConsole::new_Connection()
   {
   }

これは、プログラムが指定されたポートでリッスンを開始し、それに telnet で接続すると、ある種の接続が確立されるという点でうまく機能しますが、new_Connection() が呼び出されることはありません!

2005 年にさかのぼるこの問題に関する投稿を見たことがあるので、明らかに新しいことではありませんが、問題に対する満足のいく答え (または実際の答え) は見つかりませんでした。これは、Qt サーバー プログラムを書いた人でさえ、職場の全員を困惑させました。既存のフレームワークに根本的な問題があると推測していますが、それが何であるかはわかりません。

私はこれで1日半髪を引き裂いていました.成功に近づいたのは、実際にソケットを返すwaitForNewConnection()を使用することでしたが、readReady()エミッタに接続したとき、それは決してありませんでしたどちらかを解雇した。では、これらのシグナルが呼び出されないようにするにはどうすればよいでしょうか?

私の正気を惜しまないで、できる限り私を助けてください。

4

2 に答える 2

1

Linux でのもう 1 つの実用的な例ですが、QTcpServer を使用して Linux と Windows の両方で問題なく実行するプログラムをコーディングしたことがあります。これでうまくいかない場合は、Qt のインストールまたは OS の構成に問題があるはずです。それかQtバージョンのバグです。

~/tcp_test$ qmake --version
QMake version 2.01a
Using Qt version 4.8.6 in /usr/lib/x86_64-linux-gnu

~/tcp_test$ for file in qconsole.{h,cpp} main.cpp tcp_test.pro ; do echo -e "$file:\n"; cat $file; echo; echo; done
qconsole.h:

#include <QDialog>
#include <QTcpServer>

class QConsole : public QDialog
{
    Q_OBJECT
public:
    QConsole();
public slots:
    void connection();
private:
    QTcpServer server;
};


qconsole.cpp:

#include "qconsole.h"

QConsole::QConsole()
{
    server.listen(QHostAddress::Any, 12346);
    QDialog::connect(&server, SIGNAL(newConnection()), this, SLOT(connection()));
}

void QConsole::connection()
{
    qDebug("got connection");
}


main.cpp:

#include <QApplication>
#include "qconsole.h"

int main( int argc, char *argv[] )
{
    QApplication app(argc, argv);
    QConsole * window = new QConsole();
    window->show();

    return app.exec();
}


tcp_test.pro:

QT = core gui network

CONFIG += debug

TARGET = tcp_test

SOURCES = main.cpp  qconsole.cpp

HEADERS = qconsole.h


~/tcp_test$ ./tcp_test &
[3] 9784

~/tcp_test$ nc localhost 12346
got connection
^C
于 2013-09-30T14:21:08.577 に答える