崩溃QT
问题描述:
调用构造函数之外新的运营商时,我有一个关于一个奇怪的问题(至少是出乎意料的对我来说)行为(它崩溃)QT的一个成员比类构造函数初始化不同指针时。我附上我的代码部分:崩溃QT
在mainwindow.h:
class MainWindow : public QMainWindow
{
...
private:
QPixmap *qpm_s1_yaw;
QPainter *s1_yaw_painter;
...
}
在mainwindow.cpp:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
...
initGraph(qpm_s1_yaw, s1_yaw_painter, ui->YAW1);
...
}
void MainWindow::initGraph(QPixmap *map, QPainter *painter, QLabel *label)
{
map = new QPixmap(label->size());
map->fill(Qt::white);
painter = new QPainter(map);
... doing some stuff ...
label->setPixmap(*map); // ++(Remember this LINE)++
}
的实际工作,但是当我发表意见行:
label->setPixmap(*map)
,而是设置在像素图的构造(主窗口::主窗口)通过写
ui->YAW1->setPixmap(*qpm_s1_yaw)
我得到一个分段错误。
有人能解释什么是错呢?为了使工作我必须初始化所有的指针在构造函数(和评论在班组长成员initGraph那些线),像这样:
qpm_s1_yaw = new QPixmap(ui->YAW1->size());
s1_yaw_painter = new QPainter(qpm_s1_yaw);
initGraph(qpm_s1_yaw, s1_yaw_painter, ui->YAW1);
ui->YAW1->setPixmap(*qpm_s1_yaw);
感谢
答
这是C++是如何工作的一个小小的误会,与Qt无关。
你的代码,你撒谎:你同样可以很好写:initGraph(0, 0, ui->YAW1)
。你正在初始化局部变量而不是类成员。您作为前两个参数传递的值不用于任何事情。
这也是完全没有必要持有像素图和指针的画家。通过值来保存像素图,并且在绘画时仅为它实例化画家。
当你没有在它上面绘画时,将一个画家拿到一个像素图中,当像素图被消耗(读取)时,可能会导致不必要的像素副本:一个带有活动画家的像素图被认为是“脏的”。
你应该怎么做,然后是按值保存pixmaps,你可以从initGraph
返回新值 - 这从存储pixmap的周围类的细节中解耦initGraph
。 initGraph
的用户具有不存储该像素图的选项,并且例如查询标签本身。
class MainWindow : public QMainWindow
{
Ui::MainWindow ui; // hold by value
...
QPixmap qpm_s1_yaw; // hold by value
QPixmap initGraph(QLabel *label) {
QPixmap pixmap{label->size()};
pixmap.fill(Qt::white);
QPainter painter{&pixmap};
//... doing some stuff ...
label->setPixmap(pixmap);
return pixmap;
}
public:
explicit MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
ui.setupUi(this);
gpm_s1_yaw = initGraph(ui.YAW1);
}
};
至少,对于崩溃,您需要在程序中包含堆栈跟踪和所有相关变量的值。 – MrEricSir