- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
您好,我是 c++ 的新手,我一直在尝试在 Ubuntu 上创建一个程序,该程序将在多个设备上获取 Opengazer(注视跟踪软件)的输出并返回一个坐标。这是通过为每个设备打开一个 UDP 套接字来完成的,该套接字然后将 [Xcoordinate Ycoordinate] 形式的文本输出发送到主程序,然后在主程序中比较数字并输出正确的坐标。
我发现在 Qt 中创建图形用户界面是建立每个设备相对位置的最佳方式。基本上,我遇到的问题是将 UDP 套接字上的信息返回到主程序。在 getInfo 函数中,我创建了主窗口,我的设备(另一个称为 DeviceWidget 的类)在其中创建并且可以移动以设置它们的相对位置。每个 DeviceWidget 都有一个与之关联的 UDP 套接字。我想在窗口关闭时返回所有 DeviceWidgets 的 QList,但我遇到了困难,因为当窗口关闭时,所有的 child 都被销毁了。我还读到按钮不能返回值,所以这也不起作用。
我正在发布 main.cpp 和 window.cpp。我可以发布更多,但我相信只有这两个是必要的。
有什么想法吗?感谢您的宝贵时间。
main.cpp
#include <QApplication>
#include "window.h"
#include "devicewidget.h"
#include <QTimer>
QList<DeviceWidget*> getInfo(int argc, char *argv[]);
void delay();
int main(int argc, char *argv[])
{
bool run = true;
int numDevices, space, size;
DeviceWidget *point;
QList<DeviceWidget*> dList = getInfo(argc, argv);
numDevices = dList.size();
int xPos[numDevices], yPos[numDevices];
QString buffers[numDevices], xString, yString;
//begin tracking gaze
if(run)
{
for(int i=0; i<numDevices; i++)
{
//get output of opengazers
point = dList.at(i);
buffers[i] = point->Server->getBuffer();
space = buffers[i].indexOf(" ");
size = buffers[i].size();
xString = buffers[i].left(space);
yString = buffers[i].right(size-space-1);
xPos[i] = xString.toInt();
yPos[i] = yString.toInt();
}
//print coordinate
for(int i=0; i<numDevices; i++)
{
if((dList.at(i)->getXRes()/6<xPos[i]<dList.at(i)->getXRes()*5/6) && (dList.at(i)->getXRes()/4<xPos[i]<dList.at(i)->getXRes()*3/4))
{
qDebug() << xPos[i]+dList.at(i)->getXPos()*9-dList.at(0)->getXPos()*9 << " " << yPos[i]+dList.at(i)->getYPos()*9-dList.at(0)->getYPos()*9;
}
}
delay();
}
return 0;
}
QList<DeviceWidget*> getInfo(int argc, char *argv[])
{
QApplication a(argc, argv);
Window w;
w.show();
a.exec();
return w.getList();
}
void delay()
{
QTime dieTime= QTime::currentTime().addSecs(1);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
窗口.cpp
#include "window.h"
#include <QFrame>
#include <QPushButton>
#include <QVBoxLayout>
#include <devicewidget.h>
#include <QWidget>
#include <QDesktopWidget>
#include <QList>
#include "portdialog.h"
#include "udp.h"
Window::Window(QWidget *parent) :
QWidget(parent),
frame(new QFrame(this)),
addButton(new QPushButton("Add Device", this)),
doneButton(new QPushButton("Done", this))
{
QVBoxLayout *layout = new QVBoxLayout;
frame->setLineWidth(2);
frame->setFrameStyle(QFrame::Box | QFrame::Plain);
QPoint topLeft(0,0);
QPoint bottomRight(100,100);
const QRect rect(topLeft, bottomRight);
frame->setFrameRect(rect);
frame->setFixedHeight(300);
frame->setFixedWidth(500);
layout->addWidget(frame);
layout->addWidget(addButton);
layout->addWidget(doneButton);
setLayout(layout);
connect(addButton, SIGNAL(released()), this, SLOT(on_addButton_pressed()));
connect(doneButton, SIGNAL(released()), this, SLOT(on_doneButton_pressed()));
DeviceWidget *primary = new DeviceWidget(frame, 200, 200, 20230);
primary->setFixedHeight(getResolutionY()/10);
primary->setFixedWidth(getResolutionX()/10);
primary->show();
primary->move(200,200);
list.append(primary);
}
void Window::on_addButton_pressed()
{
//pop-up for port
PortDialog *pop = new PortDialog(this);
pop->exec();
int port = pop->getPort();
/*int xRes = pop->getXRes();
int yRes = pop->getYRes();*/
int xRes = 1360;
int yRes = 760;
//create and show widget
DeviceWidget *secondary = new DeviceWidget(frame, 200, 200, port);
secondary->createServer(port, xRes, yRes);
secondary->setFixedHeight(secondary->getYRes() / 9);
secondary->setFixedWidth(secondary->getXRes() / 9);
secondary->show();
secondary->move(200,200);
list.append(secondary);
}
void Window::on_doneButton_pressed()
{
this->close();
}
int Window::getResolutionX()
{
QDesktopWidget widget;
QRect mainScreenSize = widget.availableGeometry(widget.primaryScreen());
return mainScreenSize.width();
}
int Window::getResolutionY()
{
QDesktopWidget widget;
QRect mainScreenSize = widget.availableGeometry(widget.primaryScreen());
return mainScreenSize.height();
}
QList<DeviceWidget*> Window::getList()
{
return list;
}
最佳答案
嗯,我觉得代码太多了,下次尽量简洁一点。 (我们不在乎您的框架尺寸是 300x500 还是其他任何尺寸 :p)
我不喜欢你在这里做的事:
PortDialog *pop = new PortDialog(this);
pop->exec();
int port = pop->getPort();
我认为您可以使用信号和槽来解决您的问题。在你的 PortDialog 中,你做你的事情,当你想获得一个值(计算的,由用户写的,等等)时,你只需 emit(sigPortValue(int val));
在你的void Window::on_addButton_pressed()
函数,你可以这样写
void Window::on_addButton_pressed()
{
//pop-up for port
PortDialog *pop = new PortDialog(this);
connect(pop, SIGNAL(sigPortValue(int), this, SLOT(slotHandlePortValue(int));
pop->exec();
[...]
}
显然,处理上面提到的插槽中的端口值。这是第一点。
第二点是关于QList。需要明确的是,这个 QList<DeviceWidget*> getInfo(...)
是一个返回 QList 拷贝的函数。什么的 QList?指向 DeviceWidget 的指针。当你复制一个列表时,你复制的是列表的内容(这里是指针)而不是指向的对象。并且因为您的 DeviceWidgets 将 MainWindow 作为父窗口,它们将被删除(您正确地理解了这一点!)。
我看到两个解决方案:
孤儿解决方案
而不是写DeviceWidget *primary = new DeviceWidget(frame, 200, 200, 20230);
, 你可以省略 frame
, 因此没有任何父级,DeviceWidget 不会被自动删除。注意正确delete
尽管对象!
其他沟通方式
您可以将信息存储在文件中,而不是尝试直接在代码中交流信息,但是您可以自行决定什么是满足您需求的最佳解决方案。
希望这对你有帮助;)
关于c++ - Qt 主窗口关闭后如何返回信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25164882/
03-25 05:52:15.329 8029-8042/com.mgh.radio W/MediaPlayerNative: info/warning (703, 0) 03-25 05:52:15
我一直在 Internet 上到处寻找关于 FrameworkElementFactory 类的适当文档,但我似乎找不到有关它的适当教程或有用信息。 请问对这个问题了解更多的人可以给我更多的信息吗?这
我需要知道一个线程在进入等待状态之前如何将其ID发送到另一个线程。我想传递一个带有其ID的变量,但我不知道该怎么做。 最佳答案 如果只有一个线程及其父线程,则可以使用全局变量,因为它们在所有线程之间共
我正在尝试制作一个程序,该程序可以读取命令行上的所有单词,然后将其打印在新行上,而我想要做的是这样的: Some text: hello 但是相反,我得到了这样的东西: Some text: Hell
我有一个连接到rabbitmq服务器的python程序。当该程序启动时,它连接良好。但是当rabbitmq服务器重新启动时,我的程序无法重新连接到它,并留下错误“Socket已关闭”(由kombu产生
我正在设置CI / CD管道。部署步骤运行以下命令: kubectl apply -f manifest.yml --namespace kubectl rollout status Deploym
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
这是我在文件上运行 svn info 时输出的一部分: Last Changed Author: [user] Last Changed Rev: 269612 Last Changed Date:
所以我正在构建这个音乐应用程序,到目前为止它只扫描 SD 卡内的特定文件夹。这将返回路径,然后播放它们。 几个小时前我得知android系统中有一个媒体文件数据库所以 我想知道这个媒体文件数据库是否存
我正在绘制树形图,并且想知道如何绘制树类的相对百分比,即 A组=100 B地=30 C地=50 D 地 =20 然后,在图中,应该添加: A 组“50%” B 组“15%” 等在其“Group X”标
我正在构建一个社交网站,我想知道如何在用户首次登录时显示交互式教程和信息。比如只有在第一次登录时,用户才会被要求在他们的个人资料中填写更多信息。我怎样才能通过 php 和 mysql 实现这一点?例子
我是 java servlet 的新手。我研究了一些关于 servlet 的代码,但我真的很想知道更多基本的东西以及它是如何工作的。我只是想知道什么类型的 Material /内容可以从 java s
我想知道是否有办法为 user_id、sender_user_id 和 recipient_user_id 提供 name 信息来自 this fiddle 中的模式. 我现在唯一能想到的办法就是做这
这是我存储2个大学生信息的源代码。我想从输入中获取每个人的姓名、姓氏、ID 和 5 分,然后在输出中显示它们。我在输出中显示分数时遇到问题。 请帮忙 #include using namespace
假设我有一张带有条形图的图像,如下所示: 我想提取条形图和标签的值,除了训练 ML 模型之外,还有其他方法吗? 我有一堆图像,我为其生成了图表和一些描述。我目前正尝试仅从我能够做到的描述中提取信息,但
有没有办法从 GKTurnBasedParticipant 对象中检索玩家的名字?似乎除了根据类引用的难看的 playerID 之外,没有办法显示有关游戏玩家的相关信息。还是我遗漏了什么? 谢谢...
我有一个随机抛出“KeyNotFoundException”的 C# Silverlight 应用程序。我不知道找不到什么 key 。这让我想到了两个问题: KeyNotFoundException
本文实例为大家分享了ios获取本地音频文件的具体代码,供大家参考,具体内容如下 获取本地音频文件地址: ?
下面为大家介绍利用SQL查询语句获取Mysql数据库中表的表名,表描述、字段ID、字段名、数据类型、长度、精度、是否可以为null、默认值、是否自增、是否是主键、列描述 1、查询表信息(表名/表
问题 有没有办法获取代码中使用属性的位置,或声明成员变量的位置? 我不是在寻找解决此问题的方法,只是寻求一个简单的答案,无论这在技术上是否可行。 一些背景信息 我已经定义了一个属性,该属性使用提供给属
我是一名优秀的程序员,十分优秀!