2

Unix で利用可能なソケット インターフェイスを使用して C で記述したテスト UDP サーバー アプリケーション用に、Qt を使用して GUI を開発しています。GUI の目的は、すべてのメッセージ (perror と fprintf) を「テキスト編集ボックス」または「テキスト ブラウザ ボックス」に表示することです。ここに私のコードがあります、

 //-----------------------------Main.Cpp------------------------------------------//

//-----------------------------QT specific headers-------------------------------//
#include "mainwindow.h"
#include <QApplication>
#include <QLabel>
//------------------------------------------------------------------------------------//


int main(int argc, char *argv[])
{
int sock_fd=0;
funct_class funct_class_obj;
QApplication a(argc, argv);
MainWindow w;
sock_fd=funct_class_obj.udp_config();
funct_class_obj.recv_fucnt(sock_fd);

return a.exec();
}
//--------------------------------End of main.cpp------------------------------//

//-----------------------------mainwindow.cpp----------------------------------//

//-----------------------------QT specific headers-----------------------------//
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QLabel>
//-----------------------------------------------------------------------------//


//--------------------------------C program specific headers------------------//
#include <stdio.h>
#include <stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/types.h>
 //---------------------------------------------------------------------------//


unsigned char message[50];

QString mystr;

int funct_class:: udp_config()
{
     int sock_fd=0;

     if ((sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
        perror("\nError creating socket\n");
         //mystr = "\nError creating socket\n";


     else
     {
        fprintf(stdout, "\nSuccessfully created socket with descriptor:%d\n", sock_fd);
        //mystr = "Successfully created socket";

        struct sockaddr_in sock_addr = {0};
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons(PORT);
        if (inet_aton("127.0.0.1", &sock_addr.sin_addr) < 0)
        perror("\nError converting destination IP address from dotted decimal to     binary\n");
        //    mystr = "Error converting destination IP address from dotted decimal to binary";

     else
     {
        if (bind(sock_fd, (struct sockaddr*)&sock_addr, sizeof(sock_addr)) < 0)                         // Bind function call binds the properties assigned above to the socket created earlier
        perror("\nError binding the port and IP address with the socket\n");
        //mystr = "Error binding the port and IP address with the socket";

     else
        fprintf(stdout, "\nBinding port and IP address successful\n");
        //    mystr = "Binding port and IP address successful";

     }
     }

     return sock_fd;
}



void funct_class:: recv_fucnt(int sock_fd)
{
    struct sockaddr_in recv_sockaddr = {0};
    socklen_t recv_sockaddr_len = sizeof(recv_sockaddr);
    int recv_data=0;

    if ((recv_data = recvfrom(sock_fd, message, sizeof(message), 0x00, (struct     sockaddr*)&recv_sockaddr, &recv_sockaddr_len)) <= 0)

        perror("\nError receiving data/no data received\n");
        //mystr = "Error receiving data/no data received";


        else
        fprintf(stdout, "\nSuccessfully received %d bytes of data\n", recv_data);
    fprintf(stdout, "\nData is :%s", message);
           //mystr = "Successfully received data";
    mystr = QString::fromStdString((const char*)message);


}



MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->testedit->setText(mystr);
//ui->mytextbrowser->setText((mystr));
}



MainWindow::~MainWindow()
{
delete ui;
}

//-----------------------------End of mainwindow.cpp---------------------------//

//------------------------------------mainwindow.h-----------------------------//

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#define PORT 5030


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();


private:
Ui::MainWindow *ui;
};


class funct_class{

public:
int udp_config();
void recv_fucnt(int sock_fd);

};




 #endif // MAINWINDOW_H


//-------------------------------End of mainwindow.h-----------------------------//

アプリケーションは正常にコンパイルされていますが、実行時に問題に直面しています。フリーズするだけで、フリーズから抜け出したとしても、「テキスト編集ボックス」または「テキストブラウザボックス」に必要な文字列を表示できません。助けてください。

PS: 私は GUI プログラミングと Cpp の初心者です。

4

1 に答える 1

1

問題はかなり明確なようです:

ui->testedit->setText(mystr);

これはコンストラクターでのみ呼び出され、他の場所では呼び出されません。つまり、あなたmystrが更新されても、ウィジェットはそれを認識しません。あなたが期待しているようには機能しません。これは 1 回限りのプロパティ バインディングではないため、文字列が変更されたときにウィジェットに自動的かつ透過的に通知されます。その作業は自分で行う必要があります。

QtNetworkさらに、BSD ソケットを使用したプラットフォーム固有の POSIX API ではなく、Qt ベースのクライアントでの使用を目指す必要があります。

于 2014-07-21T06:51:13.480 に答える