205_QT_BUG_复式自写小项目的问题总结

在这里插入图片描述

1、QT 5 新语法之信号重载问题

QSpinBox,而这个类中定义了两个名字叫 valueChanged 的信号
在这里插入图片描述

(1)static_cast强制类型转换:

static_cast可以在指向相关类的指针之间执行转换,不只是upcast(从pointer-to-derive 到 pointer-to-base),还可以进行向下转换(从pointer-to-base到pointer-to-derive )。在运行时不执行检查,以保证被转换的对象实际上是目的地类型的完整对象。因此,由程序员来确保转换是安全的。另一方面,它不会产生动态转换的类型安全检查的开销。

特点:
1.用于基本类型间的转换
2.不能用于基本类型指针之间的转换
3.用于有继承关系类对象之间的转换和类指针之间的转换

example:

    class Base {};
    class Derived: public Base {};
    Base * a = new Base;
    Derived * b = static_cast<Derived*>(a);

这是有效的代码,尽管b会指向类的不完整对象,如果取消引用,可能会导致运行时错误。
————————————————
版权声明:本文为CSDN博主「GeekBuilding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40416052/article/details/82558451

QT6.0后的中文显示

series0->setName(QString::fromLocal8Bit("sin曲线"));
series1->setName(QString::fromLocal8Bit("cos曲线"));

2、Qt之qobject_cast的描述

qobject_cast的原型如下

T qobject_cast(QObject *object)
1

如果传入的object是T或者T的子类,则返回T,否则返回0。如果object是0则返回0。
类T必须直接(或间接)继承自QObject,并且要声明宏Q_OBJECT。
类通常继承本身。
举例:

QObject *obj = new QTimer;  // QTimer继承QObject
QTimer *timer = qobject_cast<QTimer *>(obj);    // timer == (QObject *)obj
QAbstractButton *button = qobject_cast<QAbstractButton *>(obj); // button == 0
1
2
3

警告:如果T没有声明宏Q_OBJECT,那么函数的返回值是不确定的。

使用场景:

当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,
所以你在对应的slot里就可以通过消息发送者-sender()得到当前是谁调用-invoke了你的slot。
有可能多个 Object的signal会连接到同一个slot(例如多个Button可能会connect到同一个slot函数onClick()),
因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理.
在槽函数中:

QObject *obj = sender();    // 返回发出信号的对象,用QObject类型接收
QPushButton *button = qobject_cast<QPushButton *>(obj);  // 向下转型为按钮类型

————————————————
版权声明:本文为CSDN博主「linuxweiyh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linuxweiyh/article/details/76512337
在这里插入图片描述

在这里插入图片描述

3、QPushbutton之设置属性 setProperty()

QPushbutton *Btn_Link;
Btn_Link->setProperty("linkeState",false);//初始化该按钮的linkState状态为false;

在连接成功的时候用

Btn_Link->setProperty("linkeState",true);

此函数运用可判断该按钮的状态为哪一种,而不需要在添加成员变量进行标记了。简单好用。

一个按钮可以设置多种属性。

Btn_Link->property("linkeState").toBool() = false 或者true;

————————————————
版权声明:本文为CSDN博主「Nostalgia丷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39501474/article/details/112470751
在这里插入图片描述
在这里插入图片描述

4.warning: 'MainWindow::ui' will be initialized after [-Wreorder]

原因: QT中对于变量初始化需要按照你声明时的顺序,否则会报这个警告
解决: 按照你声明的顺序初始化变量

  • 修改日期–2021.1.2
  • 把头文件中的类指针,都放到私有中,然后cpp的构造中进行赋初值,避免警告
  • 在这里插入图片描述
    在这里插入图片描述

QGraphicsScene::itemAt()

QGraphicsScene::itemAt()返回特定上最顶端的item。所有的item查找函数都以出栈序列返回(也就是说,第一个返回的是最顶端的,最后一个返回的是最底端的)。

QGraphicsScene  scene; 
QGraphicsRectItem  *rect=scene.addRect(QRectF(0,0,100,100)); 
QGraphicsItem  *item=scene.itemAt(50,50); //item==rect; 

QGraphicsScene的事件传播结构会把场景事件投递到items,也管理多个items之间的传递。假如场景收到了鼠标在某个位置press事件,场景会把这个事件投递给处在那个位置的item

坐标映射

经常,处理场景中item时,在场景与item之间,item与item之间,视图与场景之间进行坐标映射,形状映射是非常有用的。

举例来讲,当你在QGraphicsView的视口中点击鼠标时,你应该通过调用QGraphicsView::mapToScence()与QGraphicsScene::itemAt()来获知光标下是场景中的哪个item。
假如你想获知一个item位于视口中的什么位置,你应该先在item上调用QGraphicsItem::mapToScene(),然后调用QGraphicsView::mapFromScene()。

最后,假如你想在一个视图椭圆中有哪些items,你应该把QPainterPath传递到mapToScene(),然后再把映射后的路径传递到QGraphicsScene::items()。
你可以调用QGraphicsItem::mapToScene()与QGraphicsItem::mapFromScene()在item与场景之间进行坐标与形状的映射。也可以在item与其父item之间通过QGraphicsItem::mapToParent()与QGraphicsItem::mapFromItem()进行映射。

所有映射函数可以包括点,矩形,多边形,路径。视图与场景之间的映射也与此类似。对于从视图与item之间的映射,你应该首先映射到场景,然后再从场景向item进行映射。
Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解

滑动条文字显示位子

在这里插入图片描述

在类外定义static变量时要省去static关键字

在这里插入图片描述
在这里插入图片描述

QGraphicsView中的mapToScence使用方法

正常的坐标系都是从屏幕左上角开始的,即左上角为(0,0)

对于graphicsview来说,坐标系则是从中间开始的

要知道正常的坐标系都是从屏幕左上角开始的,即左上角为(00),
但是对于graphicsview来说,坐标系则是从中间开始的,向下为y正方向,向右为x正方向

从设置的mouseDoubleClickEvent中获得event.pos()的位置
只是相对于这个widget来说,即坐标中心在左上角,但是怎么转到对应的graphicsview就有意思了

首先调用mapFromParent函数对上面的Qpoint进行处理,然后再通过mapToScene函数
获得你在graphicsview中的位置

mapToScene主要解决了怎么从父widget中得到相应的坐标,
然后通过mapToScene函数进行转换,即可得到相应的坐标


**简单来说这个函数就是为了将之前(父widget)的坐标转换到目前的坐标系中去**

Qt报warning: ‘setAxisX‘ is deprecated的解决方法

将如下代码:

m_chart->setAxisX ( axisX, series_1 );
m_chart->setAxisY ( axisY, series_1 );

修改为:

m_chart->addAxis ( axisX, Qt::AlignBottom );
m_chart->addAxis ( axisY, Qt::AlignLeft );
series_1->attachAxis ( axisX );
series_1->attachAxis ( axisY );

例如:

    //创建坐标轴,给定坐标点
    QValueAxis * xAxis = new  QValueAxis;
    xAxis->setRange(0, 10);
    //chart->setAxisX(xAxis, series0);
    //chart->setAxisX(xAxis, series1);
    chart->addAxis ( xAxis, Qt::AlignBottom );
    series0->attachAxis ( xAxis );
    series1->attachAxis ( xAxis );

    QValueAxis * yAxis = new  QValueAxis;
    yAxis->setRange(-1, 1);
//    chart->setAxisY(yAxis, series0);
//    chart->setAxisY(yAxis, series1);
    chart->addAxis ( yAxis, Qt::AlignLeft );
    series0->attachAxis ( yAxis );
    series1->attachAxis ( yAxis );

在这里插入图片描述

QToolBox-每个页面的名称,currentItemText属性

QToolBox是一个可以显示一列层叠窗口部件,就像QQ联系人列表一样的多个列表展示界面,只有一个列表可以被当前展开。我们在设计模式下将一个QToolBox放到当前窗口下(frameShape选择Box),可以看到默认有两个窗口页面,当前页面为Page1,点击Page2后当前页面为Page2,通过currentItemText属性来设置当前页面的标题名,我们将他俩改成“好友”、“陌生人”之后再右击QToolBox选择插入页,再设置其名称为“黑名单”,再运行程序就会看到以下显示效果:

在这里插入图片描述在这里插入图片描述

QToolBox-每个页面的图标的设置,currentItemIcon属性,选择资源设置

在这里插入图片描述

07黑马QT笔记之信号重载时connect的写法(带参数的信号),两个相同的信号

信号重载

在这里插入图片描述

Qt之‘qsrand’未找到,原因以及解决方案

‘qsrand’未找到,原因以及解决方案
.
.

QT给放置在工具栏中的图标,设置下置文本text

在这里插入图片描述

在这里插入图片描述

error: cannot initialize object parameter of type ‘Ui_MainWindow’ with an expression of type ‘Ui::MainWindow’

C: ios2021\c++_QT\smapl_2022_3_15\ MainWindow .cpp:8:错误:不能用类型为“Ui::MainWindow”的表达式初始化类型为“Ui_MainWindow”的对象参数
在这里插入图片描述
在这里插入图片描述

QT       += charts



#include    <QtCharts>  //必须这么设置
QT_CHARTS_USE_NAMESPACE

QValueAxis、QCategoryAxis的简单区别

简单的说QValueAxis是一个懒人版,轴的范围什么的不需要自己指定,轴上显示的label(也就是0,1,2,3这些内容)是默认的。qt会根据你轴上的点自动设置。
若你需要自定义一些内容,QCategoryAxis是比较好的,但是需要自己自定义好才可以调用。

解决QString::asprintf()在QT6.0中中文显示乱码问题,将数据先保存到数组中,在转换成Qstring

    /*饼状图没有坐标轴的概念,但是其有自己的方式*/
    QPieSlice * slice;
    for(int i = 0; i < 5; i++)
    {
        slice = series->slices().at(i);/*拿到树状图中的一整行数据,包含每科的标头 + 各科分数*/

        memset(buffer, 0, sizeof(buffer));
        sprintf(buffer, "   有%.0f人,占%.1f",  slice->value(), slice->percentage() * 100 );
        QString qStr2 = QString::fromLocal8Bit(buffer);
        slice->setLabel(slice->label() + qStr2 + QString::fromLocal8Bit("%"));


    }

does not name a type; did you mean

这里的主类,在声明使用子类的类指针的时候,如果没有提前在主类的外面,声明一下这个子类的类,就会报错
在这里插入图片描述
但是哟时候又不报错,当然报错的时候,上诉处理就可以了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值