单击"推送"按钮应使用Qt C++在不同的窗口中显示绘图

Clicking on Push button should show the plot in different window using Qt C++

本文关键字:quot 窗口 显示 绘图 Qt 按钮 推送 单击 C++      更新时间:2023-10-16

>我正在尝试编写一个Qt C++代码,该代码应该通过单击按钮在单独的窗口中绘制绘图。

我通过创建两个表单 1:主窗口、2:对话框来做到这一点。单击按钮后,绘图立即出现在不同的窗口中,接下来另一个对话框窗体窗口将覆盖我的绘图窗口。

总结一下,单击按钮会生成两个不希望的窗口。

我做了以下工作:

  1. 使用Qt小部件应用程序创建新项目,该应用程序生成主窗口.cpp和主窗口.h文件以及main.cpp文件

  2. 使用表单在主窗口上创建按钮.cpp文件

  3. 通过
  4. 右键单击项目,使用"添加新"创建新的对话框表单

  5. 然后编写代码在主窗口.cpp文件中的on_pushButton_clicked((内生成绘图(使用图表(

  6. 然后运行代码。最终出现按钮窗口。然后我点击按钮,然后它会生成两个单独的窗口 1:绘图窗口, 2:空白对话框窗口

总共有三个 *.cpp 文件,两个 *.h 文件

这是主窗口.cpp代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"dialog.h"
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCharts/QChartView>
#include <QtCharts/QLineSeries>
QT_CHARTS_USE_NAMESPACE
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_clicked()
{
Dialog aa;
aa.setDisabled(false);
//aa.display();
//![1]
QLineSeries *series = new QLineSeries();
//![1]
//![2]
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
series->append(10, 5);
*series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
//![2]
//![3]
QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle("Simple line chart example");
//![3]
//![4]
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
//![4]

//![5]
QMainWindow window;
window.setCentralWidget(chartView);
window.resize(400, 300);
window.show();
//![5]
aa.exec();
}

实际结果:单击按钮生成两个单独的窗口 1:绘图窗口,2:空白窗口

预期结果: 单击按钮应仅生成绘图窗口

您创建并显示 2 个窗口:aa作为模态对话框(exec()QDialog 上的对话框显示为模态对话框(和window

要修复它,您可以在对话框中显示绘图,您需要为对话框创建布局并将chartView添加到该布局中:

//...
//comment the other main window creation, we will setup the plot inside aa
//![5]
//QMainWindow window;
//window.setCentralWidget(chartView);
//window.resize(400, 300);
//window.show();
//
//create a layout for the dialog (most likely you'll need to #include <QVBoxLayout>)
aa.setLayout(new QVBoxLayout());
//add chartView into the layout
aa.layout()->addWidget(chartView);
//...

注意:如果你想要一个非模态对话框(或窗口(,你需要在堆上分配小部件(如果在堆栈上分配,窗口只会显示并立即关闭,因为析构函数取消分配小部件(。