用于UDP数据包接收的Qt GUI
Qt GUI for UDP packet reception
我正在使用Qt开发一个GUI,用于测试UDP服务器应用程序,我使用unix中可用的套接字接口用C编写。我的GUI的目标是在"文本编辑框"或"文本浏览器框"中显示所有消息(错误和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 socketn");
//mystr = "nError creating socketn";
else
{
fprintf(stdout, "nSuccessfully created socket with descriptor:%dn", 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 binaryn");
// 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 socketn");
//mystr = "Error binding the port and IP address with the socket";
else
fprintf(stdout, "nBinding port and IP address successfuln");
// 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 receivedn");
//mystr = "Error receiving data/no data received";
else
fprintf(stdout, "nSuccessfully received %d bytes of datan", 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-----------------------------//
应用程序正在编译,但我面临的问题,当我执行它。它只是冻结,即使我设法把它从冻结中取出,我也无法在"文本编辑框"或"文本浏览器框"中显示所需的字符串。请帮助。
注:我是GUI编程和Cpp的新手。
问题似乎很清楚:
ui->testedit->setText(mystr);
这只在构造函数中调用,不在其他地方调用。这意味着,当您的mystr
更新时,小部件将不会意识到它。它并不像你期望的那样起作用;它不是一次性的属性绑定,因此当字符串更改时将自动透明地通知小部件。你必须自己做那件事。
此外,您确实应该在基于Qt的客户端中使用QtNetwork
,而不是使用带有BSD套接字的平台特定POSIX API。
相关文章:
- Qt GUI使用Qfiledialogbox和qlabel显示视频,这是我的代码
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- 从其他std ::线程更新QT GUI
- 无法使用 Visual Studio 2010 和 Qt 版本 4.8.0 创建"Qt Gui Application"
- "hijacking" 给定根 QWidget* 的 Qt gui
- 尽管有线程,Qt GUI 仍挂起
- C++ Qt GUI update
- 在QT GUI中创建一个全局对象
- 在已经运行的C 控制台应用程序上实现QT GUI
- QT GUI最简单的方法可以从另一堂课访问MainWindow
- 通过Qt-tcp套接字更改Qt-GUI
- ROS-Qt GUI - 如何分发线程
- 由于线程问题,Qt-Gui没有更新
- 为Python逻辑创建一个C++Qt Gui
- Qt GUI应用程序在与GUI交互时停止实时进程
- 如何在C 中制作QT GUI应用,而不会内存泄漏
- 如何将QT GUI应用程序的版本打印到主机上
- 使用由Eclipse中的Qt设计器创建的Qt GUI
- Qt Gui 应用程序部署