如何解决从文本文件中读取第二个QPoint时出现错误,该怎么办?
从文本文件中读取矩形后,我试图绘制矩形。 这都是由我的QPushButton的pushEvent触发的,但是我在阅读第二点时遇到了问题:
void ToolBar::on_pushButton_clicked()
{
QFile file("C:/Users/kamil/Desktop/data2.txt");
if(file.open(QIODevice::ReadOnly | QFile::Text)){
QTextStream in(&file);
while (!in.atEnd())
{
QString line = in.readLine();
rects.append(RectToDraw(line,':',','));
qDebug()<<RectToDraw(line,');
}
file.close();
}
}
输出:
QRectF(324,16 -241x125)
QRectF(0,0 0x0)
QRectF(0,0 0x0)
QRectF(324,16 -241x125)
代替324,16:83,141
第二点为什么这样读? QRectF(72,22 357x108)!
我的RectToDraw类:
RectToDraw::RectToDraw(const QRectF& rect,QObject *parent) : QRectF(rect)
{
}
RectToDraw::RectToDraw(const QString &rectInString,char pointsSplitter,char xySplitter)
{
readFromString(rectInString,pointsSplitter,xySplitter);
}
//"144,81:626,232" ':' ','
void RectToDraw::readFromString(const QString &rectInString,char xySplitter)
{
QStringList point = rectInString.split(pointsSplitter);
//point ("144,81","626,232")
if(point.count()!=2) return;
QStringList xy1 = point.at(0).split(xySplitter);//xy1("144","81")
QStringList xy2 = point.at(1).split(xySplitter);
setTopLeft(QPointF(xy1.at(0).toFloat(),xy1.at(1).toFloat()));
setBottomRight(QPointF(xy2.at(0).toFloat(),xy2.at(1).toFloat()));
}
谢谢您的帮助!
解决方法
您为什么会为“ 324,16:83,141”获得QRectF(324,16 -241x125)?
您误解了qDebug
的输出。第一部分是原点,与左上角的点相同。但是第二部分是大小,而不是您认为的右下角。像您所做的那样,将右下角的点设置为83,141
,将导致大小为83 - 324 = -241
和141 - 16 = 125
。这就是为什么您将QRectF(324,16 -241x125)
作为输出的原因。
要解决此问题,请像这样使用QRectF::setBottom
的{{3}} insetad:
setSize(QPointF(xy2.at(0).toFloat(),xy2.at(1).toFloat()));
您为什么得到QRectF(0,0 0x0)
?
在RectToDraw
的第二个构造函数中,调用readFromString
,在其中进行以下检查:
if(point.count()!=2) return;
如果此检查失败,则可以跳过创建矩形的操作。如果readFromString
是某个地方的辅助函数,情况就是这样。但是在您的情况下,您的QRectF
已已构建(因为RectToDraw
是QRectF
的子类),尽管没有有效的坐标,因此您得到了那些无效的矩形{ {1}}。
作为旁注,类似QRectF(0,0 0x0)
和QPoint
的类。 QRect
和QPointF
是轻量级类,用于保存数据。但是,您尝试赋予他们更多的责任,将QRectF
子类化,让QRectF
知道如何从字符串中提取其坐标。从一侧看,这是没有意义的,因为当您在纸上绘制矩形时,它不在乎是用铅笔还是钢笔绘制,而是形状,大小和位置才是真正重要的。另一方面,您的方法会带来设计问题,从而导致上述错误。对此,我强烈建议您重新考虑应用程序的设计。
您的代码对我来说很奇怪,这里有一行代码
QString line="144,81:626,232";
QStringList points = line.split(":");
qDebug()<< points[0];
qDebug()<< points[1];
QRectF rectangle;
QStringList xy1 = points[0].split(",");
qDebug()<< xy1[0];
qDebug()<< xy1[1];
auto x1=QString(xy1[0]).toFloat();
auto y1=QString(xy1[1]).toFloat();
rectangle.setTopLeft(QPointF(x1,y1));
xy1 = points[1].split(",");
qDebug()<< xy1[0];
qDebug()<< xy1[1];
x1=QString(xy1[0]).toFloat();
y1=QString(xy1[1]).toFloat();
rectangle.setBottomRight(QPointF(x1,y1));
qDebug() << "Rec: " << rectangle;
return 0;
因此对于输入"144,232";
,您将得到输出:
Rec: QRectF(144,81 482x151)
因为这是qt打印矩形对象的方式-> topLeftPoint wxh
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。