QT
QT 问题1(QFile)
项目场景:
QT中利用QFile将QList写入txt 或者其他的文件,QDataStream可以直接写入QList,<< list,但是其写入的文件是二进制的,不方便阅读(需要保存的数据量很小)因此采用QTextStream的方式。问题描述:
在保存数据时候,遇到一个很奇怪的指针的问题
- 代码Ⅰ:
void MainWindow::Save_list(QList<int> seqNew,QString seq_string)//problem
{
QFile file("../filename.csv");
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(&file);
stream.seek(file.size());
stream << seq_string << "\n";
file.close();
}
}
此时可以写出List的名称
ABB
- 代码II
void MainWindow::Save_list(QList<int> seqNew,QString seq_string)//problem
{
QFile file("../filename.csv");
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(&file);
stream.seek(file.size());
stream << seq_string << "\n";
for(int i=0; i<seqNew.size(); i++ ){
int temp_list=seqNew.takeFirst();
stream.seek(file.size());
stream << temp_list<< "\n";
}
file.close();
}
}
此时写出的
3
ABB
4
5
变量名前面会有一个数字出现
原因分析:
肯定是指针问题,&file应该是指到了file的首个物理地址seek那里应该是寻找最后一个物理地址,感觉是在第二次寻找物理地址的时候并没有更新出最后的物理地址还是之前的,因此才会出现错误,但是还是不知道为什么不会更新?????
解决方案:
3. 代码III
void MainWindow::Save_list(QList<int> seqNew,QString seq_string)//problem
{
QFile file("../filename.csv");
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream stream(&file);
stream.seek(file.size());
stream << seq_string << "\n";
file.close();}
if (file.open(QIODevice::ReadWrite | QIODevice::Text))
{
for(int i=0; i<seqNew.size(); i++ ){
int temp_list=seqNew.takeFirst();
QTextStream stream(&file);
stream.seek(file.size());
stream << temp_list<< "\n";
}
file.close();
}
}
将文件重新关上打开最后可以正常的完成想要的功能。
ABB
3
4
5
QT 2 获得的当前时间保存成文件名
QDateTime time=QDateTime::currentDateTime();
QString filename=time.toString("yyyy_MM_dd_hh_mm_ss");
QFile file("../video/"+filename+".csv");
将获得的当前时间保存成文件名
QT slider 设计
需求
slider 但是只在固定的点停留点,类似于视觉模拟评分
方案
百度后确定方案是继承qslider写一个myslider类,在manwindow里面调用该类,放到一个容器中,需要重写鼠标点击和释放事件。没采用直接从Qwidget类开始构建,主要是因为我菜,不想太复杂。
参考链接https://blog.csdn.net/nchu_zhangyiqing/article/details/122490710
cpp 文件和 h 文件可以参考第一个链接
主要是重写
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *ev);
有个地方需要补充
myslider.cpp文件里面需要补充
MySlider::~Myslider()
{
}
调用
在主程序里面建立一个新的myslider 类,使用connect将myslider里面的鼠标释放的信号和主程序里面的空间连接起来,写对应的槽函数可以将slider对应的数值显示出来。
在具体的调用上参考
https://blog.csdn.net/qq_28351609/article/details/88818337?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.pc_relevant_aa&spm=1001.2101.3001.4242.1&utm_relevant_index=3
利用信号槽机制在主程序中获得当前slider的位置
connect(slider, SIGNAL(valueChanged(int)), this, SLOT(setLineEditValue(int)));
在主程序里面设计槽函数方便显示滑动条的值
void MyDialog::setLineEditValue(int value)
{
int pos = slider->value();
QString str = QString("%1").arg(pos);
lineEdit->setText(str);
}
具体设计
在myslider的具体设计里面,具体的设置参考官方文档:中文可以参考https://www.wenjiangs.com/doc/nbvqslfi
https://blog.csdn.net/qq_47520825/article/details/115479514
指针
从机器语言就开始学,但是经常还是弄混
指针是一个变量
它的值是一个地址
& 取值
* 访问指针中地址的值
参考:
C++指针的介绍
数组名是一个特殊的指针
从局部变量表可以看出,数组a和指针p的构成是很相似的。它们实际存的都是一个地址,都会指向一个对象(或多个对象的第一个对象)。所以说数组名其实是种特殊的指针。
参考
数组名指针的解释