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来说,坐标系则是从中间开始的
要知道正常的坐标系都是从屏幕左上角开始的,即左上角为(0,0),
但是对于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’未找到,原因以及解决方案
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
这里的主类,在声明使用子类的类指针的时候,如果没有提前在主类的外面,声明一下这个子类的类,就会报错
但是哟时候又不报错,当然报错的时候,上诉处理就可以了