首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt GUI编程查询

Qt GUI编程查询
EN

Stack Overflow用户
提问于 2015-07-14 00:58:19
回答 1查看 278关注 0票数 0

我目前正在使用Qt框架开发一个GUI应用程序。该应用程序是一个基本的“2DCAD”式界面,具有商业2DCAD软件的较少复杂性。

这个想法是,有一个工具箱(如MS paint),其中包含各种大小的矩形和正方形(此GUI的目的是在柔性基板上设计RC电路设计。该软件将生成G代码(数控机床的基本坐标信息),该G代码将输入到CNC打印机,该打印机基于所生成的G代码信息在柔性基板上打印这些电路)。每个矩形/正方形形状在一个已知目录下的文本文件中包含其‘形状’的gcode (假设这是文本文件ORIGINAL)。文本文件中的这些G代码基于从GUI的坐标系原点绘制的形状。当用户点击特定的正方形/矩形时,一个可移动/可拖动的形状会出现在QtGraphicsView小工具的“原点”上,该操作会自动在已知目录中创建一个新的文本文件,该文件会从包含在原点绘制的该特定形状的原始G-代码的文本文件(原始文本文件)中复制所有G-代码(比方说这个文本文件克隆)。由于这些形状是可移动的,因此当用户拖动/移动屏幕上的特定项目时,软件应该能够访问它为该特定项目创建的克隆文件,并根据该形状的当前坐标位置编辑/偏移从该特定形状的原始坐标复制的坐标。

例如,当用户第一次单击一个形状时,该形状出现在QtGraphicsView小部件的原点上,这将为该项目创建一个克隆,其中包含该形状的坐标/G代码,以及该形状的原始坐标/G代码。然后,用户将该项目移动到(100,-65)。因此,用户的这一操作将先前创建的克隆的每个坐标信息偏移新坐标(100,-65),并保存克隆文本文件。此外,假设用户再次从工具箱添加相同的“形状”,这将导致相同的“形状”出现在QtGraphicsView小部件的原点上。在这种情况下,在QtGraphicsView小部件上有两个相同“形状”的副本。当第二个动作发生时,GUI应该为相同形状的该副本生成一个新的克隆文件,并且当移动/拖动该形状的相应副本时,应该执行该克隆的编辑/偏移坐标。同样,当从QtGraphicsView小部件中删除特定项目时,也应该从目录中删除该项目的相应克隆。此外,GUI应该能够根据特定的原始文件为工具箱中提供的多个形状生成克隆。

说完这个想法,我现在已经用它的工具箱和QtGraphicsView小部件创建了图形用户界面的布局。我能够访问各种形状的原始文件,并为添加在QtGraphicsView小部件上的每个项目创建相应的克隆。我在这里面临的挑战是我无法对以下操作进行编码/编程,

1)每当屏幕上已经存在的项目的副本被再次添加时,我就无法为该项目创建特定的克隆。以下是从工具箱中单击一个这样的项/将其添加到QtGraphicsView小部件时的代码。

代码语言:javascript
复制
void MainWindow::on_toolButton_3_clicked()

{
    //32 Ohms resitance (base square resistor)

    ui->graphicsView->setScene(scene);
    QBrush blackBrush(Qt::darkGray);
    QPen outlinePen(Qt::black);
    outlinePen.setWidth(2);

    rect = scene->addRect(-100,-100,20,20,outlinePen,blackBrush);
    rect->setFlag(QGraphicsItem::ItemIsSelectable);
    rect->setFlag(QGraphicsItem::ItemIsMovable);
    text = scene->addText("32Ohms");
    text->setFlag(QGraphicsItem::ItemIsMovable);
    text->setFlag(QGraphicsItem::ItemIsSelectable);

    QFile file_in("/Users/vinokanthvelu/Desktop/Graphite Circuitry printer/GUI/Gcodes/32_ohm_in.rtf");
    QFile file_out("/Users/vinokanthvelu/Desktop/Graphite Circuitry printer/GUI/Gcodes/output.txt");

    if(file_in.exists() == true)
    {
        QMessageBox::information(this,"Found","File exists");
    }
    else
    {
        QMessageBox::information(this,"Error","Not found");
    }

    if(!file_in.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        QMessageBox::information(this,"Error","file_in ERROR");
        return;
    }

    QTextStream in(&file_in);
    while(!file_in.atEnd())
    {
        QString line = in.readAll();
        if(!file_out.open(QIODevice::WriteOnly|QIODevice::Text))
        {
            QMessageBox::information(this,"Error","file_out ERROR");
            return;
        }
        QTextStream out(&file_out);

        //Copy the gcodes from the source file to output file
        out << line << endl;
    }
}

这是因为在创建副本时,此操作会尝试创建与同一项目的前一个副本的克隆同名的克隆。这并不是必需的。

2)如何为添加到QtGraphicsView小部件的相同形状的每个副本的克隆创建I?这一点很重要,因为当移动/分割/删除特定形状的副本时,该特定副本的ID将用于访问相应的克隆。

3)除了我的想法是为几个形状的不同副本创建克隆,以跟踪QtGraphicsView小部件上相应原始形状的所有项目的坐标位置,还有没有其他有效的方法来实现这一点?

很抱歉发了这么长的帖子。我想提出一个清晰、详细的问题,以便更容易掌握和解决问题(我是Qt和面向对象编程的新手)。

EN

回答 1

Stack Overflow用户

发布于 2015-07-14 01:51:51

作为绘图画布上的操作的直接结果以阻塞方式访问文件通常不是一个好主意。用户体验将会非常糟糕。

您应该在程序启动时在后台线程中预加载所有预定义的形状,然后将它们作为数据结构进行维护。您应该只在用户想要保存数据时保存克隆的形状,或者自动保存,但也应该在单独的线程中完成,并使用适当的短期锁定。文件写入器应该锁定足够长的时间来制作数据的副本,然后在执行任何文件访问之前释放锁定。

这使得ID生成变得很简单:在将形状写入磁盘时,您可以生成一个唯一的顺序ID。我还质疑是否有必要将所有克隆形状写入单独的文件中。理想情况下,如果您的打印机支持它,您应该只将所有使用的形状作为RS-274X宏编写一次,然后为每个克隆实例化这些宏。这将最小化输出文件的大小,并使其保留原始设计的一些结构。RS-274X可能足以作为您唯一的设计文件格式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31389183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档