qt 基本图形编排系统

问题

文本读写

文本形式

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表示拦截