0

このサイトは本当に素晴らしいです。私の投稿に回答してくれた人に感謝します。QLineEdit からのデータの取得に関するものであるため、私の投稿は再投稿の再投稿であることがわかるでしょう。hudge stackoverflow データベースを調べて丸 2 日間問題を解決しようとしてきましたが、答えが見つかりません。

基本的に、QLineEdit から IP アドレスを取得し、QLineEdit からポート番号を取得して、次のようにします。

myclass::myclass(QWidget *parent = 0)
{
     _mainuilayout = new QGridLayout();
     ipAddress = new QLineEdit();
     portnumber = new QLineEdit();
     QFormLayout *connect2adress = new QFormLayout();
     connect2adress->addRow("Ip Adress : ", ipAddress);
     connect2adress->addRow("Port number : ", portnumber);
     _launch = new QPushButton("Launch server");
     _mainuilayout->addWidget(_launch);
     _mainuilayout->addLayout(connect2adress);

     QObject::connect(_launch, SIGNAL(clicked()), this, SLOT(setipAddress()));
     QObject::connect(_launch, SIGNAL(clicked()), this, SLOT(setportnumber()));

     server->connectTo(thisaddress,thisport);

     QObject::connect(_launch, SIGNAL(clicked()), server, SLOT(launchserver()));
}

ここで、IP アドレスを QString に格納するコードを取得しました。 thisaddress は、ヘッダーと thisport で定義された QString です。

void myclass::setipAddress()
{
     thisaddress = ipAddress->text();
}

void myclass::setportnumber()
{
    thisport = portnumber->text().toShort();
}

私が欲しいのは、起動ボタンをクリックすると、QLineEdit からのデータが thisaddress と thisport に保存され、サーバーを起動できるようになることです。これが connectTo のコードです

void server::connectTo(QString ipAdress,quint16 port)
{
    if(!ipAdress.isEmpty() && port != 0 )
    {
         ipAddress = ipAdress;
         portnumber = port;
    }
}

QLineEdit を QString に変換すると、実際に問題が発生します。これは、thisAddress と thisportnumber を直接割り当てると機能するためです。

  thisAddress = "127.0.0.1"
  thisportnumber = 5855

あまりにも私はこのエラーが発生しました:

  Unsupported socket Operation

皆さん、私を助けるための答えはありますか?QPushButton クリック時に QLineEdit のデータを QString に格納するというスタック ポストに記載されている解決策に従おうとしました が、まだ機能していません。返信ありがとうございます。

4

2 に答える 2

1

Qt を使用してから何年も経ちますが、誰もあなたの質問に答えていないようですので、2 セント追加します。

イベントを複数のスロットに接続する場合、特定の呼び出し順序は期待できないと思います。clicked()ボタンのイベントを接続し_launchて、IP アドレスとポート番号を設定し、 launchserver(). ただし、他の 2 つのスロットを最初に呼び出す必要があります。

適切なメンバー値を更新してから接続を実行する、単一のスロットに接続できる方がよいでしょう。

于 2013-03-25T02:28:35.033 に答える
0

何かが欠けているか、接続呼び出しで正確に何が起こっているかについて混乱しているようです。connect 関数は、シグナルが送信されたとき (通常はユーザーが何かを行ったとき) に何をすべきかを Qt に指示するだけです。そのイベントが発生するのを待ちません。

myclass::myclass(QWidget *parent = 0)
{
     // <snipped construction and layout>

     // Tell Qt what to do when the clicked signal happens:
     QObject::connect(_launch, SIGNAL(clicked()), this, SLOT(setipAddress()));
     QObject::connect(_launch, SIGNAL(clicked()), this, SLOT(setportnumber()));

     // At this point, nothing has been set, because the user hasn't had time to
     // fill in anything -- you've only told the application what to do when they
     // do so.
     server->connectTo(thisaddress,thisport);

     // As pointed out previously, even though you're telling the application what
     // to do, the application says nothing about the order, so you don't know if
     // this will be run before or after the slots to set the ip address and port
     // number.
     // What you do know is that it won't be run before the previous line of code,
     // which does the first connection.
     QObject::connect(_launch, SIGNAL(clicked()), server, SLOT(launchserver()));
}

以下は、より単純な実装です。

myclass::myclass(QWidget *parent = 0)
{
     _mainuilayout = new QGridLayout();
     _ipAddress = new QLineEdit();
     _portnumber = new QLineEdit();
     QFormLayout *connect2adress = new QFormLayout();
     connect2adress->addRow("Ip Adress : ", ipAddress);
     connect2adress->addRow("Port number : ", portnumber);
     _launch = new QPushButton("Launch server");
     _mainuilayout->addWidget(_launch);
     _mainuilayout->addLayout(connect2adress);

     QObject::connect(_launch, SIGNAL(clicked()), server, SLOT(launchserver()));
}

myclass::launchserver()
{
     server->connectTo(_ipAddress->text(),_portnumber->text().toShort());    
}
于 2013-03-26T19:51:04.357 に答える