C++ 在Microsoft Visual Studio和Qt addin中使用QWT的直方图,该直方图将立即关闭

C++ 在Microsoft Visual Studio和Qt addin中使用QWT的直方图,该直方图将立即关闭,c++,visual-studio-2010,qt,opencv,qwt,C++,Visual Studio 2010,Qt,Opencv,Qwt,我为VisualStudioC++使用Qt AddioGUI。 在我的GUI上,我有一个叫做plotButton的按钮,当点击时,它会绘制图像的直方图。我的绘图选项是通过使用QWT 然而,它似乎没有策划任何事情,几乎立即关闭。尝试了sleep(),但似乎也不起作用。可能是我的代码有问题吗? 以下是我的代码供参考: void qt5test1 ::on_plotButton_clicked() { //Convert to grayscale cv::cvtColor(image,

我为VisualStudioC++使用Qt AddioGUI。

在我的GUI上,我有一个叫做plotButton的按钮,当点击时,它会绘制图像的直方图。我的绘图选项是通过使用QWT

然而,它似乎没有策划任何事情,几乎立即关闭。尝试了sleep(),但似乎也不起作用。可能是我的代码有问题吗? 以下是我的代码供参考:

void qt5test1 ::on_plotButton_clicked()
{
    //Convert to grayscale
    cv::cvtColor(image, image, CV_BGR2GRAY);


    int histSize[1] = {256}; // number of bins
    float hranges[2] = {0.0, 255.0}; // min andax pixel value
    const float* ranges[1] = {hranges};
    int channels[1] = {0}; // only 1 channel used

    cv::MatND hist;
    // Compute histogram
    calcHist(&image, 1, channels, cv::Mat(), hist, 1, histSize, ranges);

    double minVal, maxVal;
    cv::minMaxLoc(hist, &minVal, &maxVal);//Locate max and min values

    QwtPlot plot; //Create plot widget
    plot.setTitle( "Plot Demo" ); //Name the plot
    plot.setCanvasBackground( Qt::black ); //Set the Background colour
    plot.setAxisScale( QwtPlot::yLeft, minVal, maxVal ); //Scale the y-axis
    plot.setAxisScale(QwtPlot::xBottom,0,255); //Scale the x-axis
    plot.insertLegend(new QwtLegend()); //Insert a legend

    QwtPlotCurve *curve = new QwtPlotCurve(); // Create a curve
    curve->setTitle("Count"); //Name the curve
    curve->setPen( Qt::white, 2);//Set colour and thickness for drawing the curve 
    //Use Antialiasing to improve plot render quality
    curve->setRenderHint( QwtPlotItem::RenderAntialiased, true );
    /*Insert the points that should be plotted on the graph in a 
    Vector of QPoints or a QPolgonF */
    QPolygonF points;
    for( int h = 0; h < histSize[0]; ++h) {
        float bin_value = hist.at<float>(h);
        points << QPointF((float)h, bin_value);
    }

    curve->setSamples( points ); //pass points to be drawn on the curve
    curve->attach( &plot ); // Attach curve to the plot 
    plot.resize( 600, 400 ); //Resize the plot
    plot.replot();
    plot.show(); //Show plot
    Sleep(100);
}

有人知道我的代码有什么问题吗?谢谢请再次注意,程序是在微软Visual StudioC++中构建的,并在其内部编写。谢谢。

绘图应使用
new
创建。现在,您可以在堆栈上创建它,因此当单击绘图按钮上的
时,它将立即被删除<代码>睡眠
不应该在这里使用,你不会从中得到任何好处

QwtPlot* plot = new QwtPlot();
plot->setTitle( "Plot Demo" ); //Name the plot
//...
plot->show(); //Show plot

plot
应使用
new
创建。现在,您可以在堆栈上创建它,因此当单击绘图按钮上的
时,它将立即被删除<代码>睡眠
不应该在这里使用,你不会从中得到任何好处

QwtPlot* plot = new QwtPlot();
plot->setTitle( "Plot Demo" ); //Name the plot
//...
plot->show(); //Show plot

问题可能是QwtPlot只是一个局部变量,即使睡眠也在主线程中,您也无法在函数返回之前及时绘制它。然后,当它完成睡眠时,它会破坏您的本地QwtPlot对象并返回,所以如果您得到这样的窗口闪烁,您就足够幸运了

要使其发挥作用,您必须这样称呼它:

QwtPlot* plot = new QwtPlot(this);

其中,这是将承载绘图(如果有)的父窗口。这样,您的小部件将保持活动状态,直到您在程序执行结束时关闭它或其父部件将其销毁。

问题可能是您的QwtPlot只是一个局部变量,即使睡眠也在主线程中,您也无法在函数返回之前及时绘制它。然后,当它完成睡眠时,它会破坏您的本地QwtPlot对象并返回,所以如果您得到这样的窗口闪烁,您就足够幸运了

要使其发挥作用,您必须这样称呼它:

QwtPlot* plot = new QwtPlot(this);

其中,这是将承载绘图(如果有)的父窗口。这样,您的小部件将保持活动状态,直到您在程序执行结束时关闭它或其父部件将其销毁。

问题在于您正在此处构造堆栈对象:

QwtPlot plot; //Create plot widget
确实,您正在尝试在方法的末尾显示绘图,但是show()方法在使用exec()调用时没有像QDialog类那样使用事件循环阻塞

它将被处理,但您将在调用之后立即离开作用域

有几种方法可以解决这个问题,但我会争取使用Qt父/子层次结构,在这种层次结构中,使用指针时会自动删除

1) Qt父/子关系

QwtPlot *plot = new QwtPlot(this);
                            ^^^^
2) 使“绘图”成为类成员

plot.show();
并在类构造函数中构造它

3) 使用智能指针

QSharedPointer<QwtPlot> plot = QSharedPointer<QwtPlot>(new QwtPlot());
QSharedPointer plot=QSharedPointer(新的QwtPlot());

这取决于您选择的类的进一步上下文,因此请尝试理解这些方法,并仔细观察。

问题在于您正在这里构建堆栈对象:

QwtPlot plot; //Create plot widget
确实,您正在尝试在方法的末尾显示绘图,但是show()方法在使用exec()调用时没有像QDialog类那样使用事件循环阻塞

它将被处理,但您将在调用之后立即离开作用域

有几种方法可以解决这个问题,但我会争取使用Qt父/子层次结构,在这种层次结构中,使用指针时会自动删除

1) Qt父/子关系

QwtPlot *plot = new QwtPlot(this);
                            ^^^^
2) 使“绘图”成为类成员

plot.show();
并在类构造函数中构造它

3) 使用智能指针

QSharedPointer<QwtPlot> plot = QSharedPointer<QwtPlot>(new QwtPlot());
QSharedPointer plot=QSharedPointer(新的QwtPlot());

这取决于您选择的类的进一步上下文,因此请尝试理解这些方法,并仔细观察。

如果您在事件范围内创建绘图,则可能会导致问题。在范围之外,垃圾收集器将对其进行清理。尝试在main window.h中声明
QwtPlot*plot
,使用load:plot=newqwtplot(0)表单定义它;在这个事件中使用它:plot->property->…您也没有将绘图插入到ui中。你应该把它插入布局、框架等中。。。布局->添加小部件(绘图)@C.CanberkBacı,谢谢。我以后再试试。然后再打电话给你result@rockinfresh尝试将问题发布到Qt/Qwt论坛。如果你够幸运的话,Uwe(qwt的创始人)会详细回答你的问题。文档可能只是一个多输出,但他对项目的支持应该得到承认。“RokHug一个更重要的事情是,如果你问C++相关的问题,而不是你的标签,你可以被否决。例如,这里我看到一个垃圾堆变量;指针问题等都与内存管理不足有关。如果在事件范围内创建绘图,则可能会导致问题。在范围之外,垃圾收集器将对其进行清理。尝试在main window.h中声明
QwtPlot*plot
,使用load:plot=newqwtplot(0)表单定义它;在这个事件中使用它:plot->property->…您也没有将绘图插入到ui中。你应该把它插入布局、框架等中。。。布局->添加小部件(绘图)@C.CanberkBacı,谢谢。我以后再试试。然后再打电话给你result@rockinfresh尝试将问题发布到Qt/Qwt论坛。如果你够幸运的话,Uwe(qwt的创始人)会详细回答你的问题。文档可能只是一个多输出,但他对项目的支持应该得到承认。@ RokHung还有一点要提,如果你问C++相关的问题,而不是你的标签,你可能会失望。