gpt4 book ai didi

c++ - Qt 主窗口关闭后如何返回信息?

转载 作者:太空狗 更新时间:2023-10-29 21:42:45 25 4
gpt4 key购买 nike

您好,我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com