问题
文本读写
文本形式
写
QFile file(currentFileName);
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))//文本形式写文件
{
return ;
}
QTextStream output(&file);
QTextCodec *code = QTextCodec::codecForName("utf8"); // UTF8格式
output.setCodec(code); // 输出流设置编码
output<<内容;
读
QFile file(currentFileName);
if(!file.open(QIODevice::ReadOnly|QIODevice::Text))//文本形式读文件
{
return ;
}
QTextStream input(&file);
QTextCodec *code = QTextCodec::codecForName("utf8"); // UTF8格式
input.setCodec(code); // 输入流设置编码
input>>内容;
二进制文件
写
QFile file(currentFileName);
if(!file.open(QIODevice::WriteOnly))
{
return ;
}
QDataStream output(&file);
output<<shapes.size();//直接这样使用
file.close();
读
QFile file(currentFileName);
if(!file.open(QIODevice::ReadOnly))
{
return ;
}
QDataStream input(&file);
input>>size;//直接这样使用
file.close();
根本区别
文本形式采用了现有的编码表,必须是编码表中有的文字、
而二进制则完全取决于自己,可以随意写入任何东西,必须知道写的顺序,才能正确读出来内容
多态类读写文件
https://blog.csdn.net/freezgw1985/article/details/5511600
qt窗口间互相调用
主窗口成员变量中有子窗口,可以直接调用
子窗口则需要通过parent()获取主窗口指针,再进行类型转换后,才能访问主窗口成员
//例子,子窗口设置父窗口中的标签文本
dynamic_cast<myWidget*>(parent())->label->setText());
ui可以删掉,不用
纯代码写
虚基类
如果不是纯虚函数,而是虚函数,则在此基类中需要加上函数体{}
如 virtual CSgAnalyseStatBase() {};
c++ multiple definitions of operator<<
如果重定义提示在同一行,可能因为你的声明和实现都放在了h文件中,但却没有在类里直接实现。
此时要么函数实现与函数声明分别放在cpp和h文件中
要么加在函数实现前面加inline关键字
要么将实现也放在函数体内
Q_OBJECT宏作用
凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。
可以理解为QObject类的一些函数,提供一些实用函数,以及qt的信号槽机制。
例子
QObject *obj;
obj->metaObject()->className()//获取类名
复合组合聚类?
复合(组合),has,某类中有另一个类的实例变量。两者不可分割
聚类,contains,某类有存放另一个类的数组。两者可以分割
label中有图片,导致布局无法自适应窗口大小?
窗口增长永动机,布局,只能大不能变小
给label设置最小大小即可。
QSize minimumSizeHint() const override//法一:重载label的此函数
{
return QSize(1000,500);
};
label->setMinimumSize(QSize(100,50));//法二:设置label的最小大小
或者直接调用label的设置函数设置,否则无法变小
原因见下个问题
踩的坑:试图拦截事件,或者重写布局,属于杀鸡用牛刀
minimumSizeHint().width()与minimumSize()是什么?
minimumSize
此属性保存小部件的最小大小
小部件的大小不能调整为小于最小小部件大小。如果小部件的当前大小更小,则小部件的大小被强制设置为最小大小。
此函数设置的最小大小将覆盖QLayout定义的最小大小。为了取消最小大小的设置,可以使用QSize(0,0)的值。
minimumSizeHint
此属性保存小部件的 推荐最小大小
如果此属性的值是无效的大小,则表示没有设置 推荐最小大小。
如果这个小部件没有布局,minimumSizeHint()的默认实现将返回无效的大小,否则将返回布局的最小大小。大多数内置小部件都重新实现minimumSizeHint()。
QLayout永远不会将小部件的大小调整到小于 推荐最小大小 的大小,除非设置minimumSize()或大小策略设置为QSizePolicy::Ignore。
如果设置了minimumSize(),推荐最小大小 将被忽略。
作用:告知此控件所属布局,此控件希望的最小大小
翻译自官方文档https://doc.qt.io/qt-5/qwidget.html
对上一个问题的理解
label中有图片且处于布局中时
如果没有设置minimumSize,则布局根据label的minimumSizeHint()决定label的大小,而label的minimumSizeHint是由布局根据布局自己的minimumSize计算得到的,即布局根据布局自己的限制来决定自己是否能缩放。很奇妙的是,当布局变大时,布局的minimumSize也会变大,导致无法缩小窗口。
一旦设置label的minimumSize,则布局不再依靠label的minimumSizeHint(),而是根据设置的minimumSize决定label的大小。且此时布局的minminimumSize也会根据label的minimumSize进行设置,不会随着布局缩放而改变了。
总之,布局的minimunSize是根据label的minimumSizeHint或minimumSize决定的,一旦有其中之一被设置,布局的minimunSize也为固定大小。
当label的两者均未设定,布局本身的miniSize会随心所欲,根据窗口大小自行变大,导致只能变大不能缩小。
qt中让控件位置岁窗口大小自动调整,并且自身大小不变
qt中可以用layout来布局,这样控件就会随着窗口的大小改变而改变,但是窗口大小改变之后,随之而来的问题是,控件的大小也会发生拉伸或者收缩.
解决这个问题的方式就是设置控件的最大和最小值,当最大和最小值相同时,无论窗口如何变化,控件的大小都不会变化了。
qt事件机制(调用顺序)
窗口大小改变会传递给布局,布局计算各控件的大小,尊重各控件的minimumSizeHint,如果改变,则触发对应控件的resizeEvent事件,然后呢?
警告:在resizeEvent()或moveEvent()中调用setGeometry()可能导致无限递归。
qt事件机制
注意,layout会被优先传递事件!还要在事件过滤器之前!
qt窗口大小改变会发生什么?
qt自定义布局
qt自定义布局
// void resizeEvent(QResizeEvent event)override;
// bool event(QEvent event)override;
// bool eventFilter(QObject target, QEvent event )override;
return true表示拦截