c++ - 单击 Push 按钮应该使用 Qt C++ 在不同的窗口中显示绘图

标签 c++ qt

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

我创建了两种形式 1:主窗口,2:对话框。单击“按钮”后,绘图立即出现在不同的窗口中,接下来会出现另一个对话框形式的窗口,覆盖我的绘图窗口。

总结是点击按钮会生成两个不希望出现的窗口。

我做了以下事情:

  1. 使用 Qt Widgets Applications 创建新项目,生成 mainwindow.cpp 和 mainwindow.h 文件以及 main.cpp 文件

  2. 使用表单在 mainwindow.cpp 文件上创建按钮

  3. 通过右键单击项目使用“添加新”创建新对话框

  4. 然后在 mainwindow.cpp 文件的 on_pushButton_clicked() 中编写代码生成绘图(使用 Chart)

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

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

这是mainwindow.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();
}

实际结果:点击PushButton产生两个独立的窗口1:绘图窗口,2:空白窗口

预期结果:点击 PushButton 应该只生成 PlotWindow

最佳答案

您创建并显示 2 个窗口:aa 作为模态对话框(QDialog 上的 exec() 将对话框显示为模态)和 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);
    //...

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

关于c++ - 单击 Push 按钮应该使用 Qt C++ 在不同的窗口中显示绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58204473/

相关文章:

c++ - 正确使用reinterpret_cast的方法

c++ - 如何使用 C++ 创建一个工具来解析 XML 文件

qt - 压缩 QImage 或 QPixmap

c++ - Qt 模型 View 编程。 QAbstractItemModel 和 QAbstractListModel。索引()和父级()

c++ - 如何使用 OpenGL 制作渐变黑效果?

c++ - mysql connector c++ 安装在树莓派上

c++ - QRCode中的Zxing汉字字符

c++ - 如何创建具有固定索引的 QList

qt - 如何在 Qt Quick 中加载外部 QML 文件?

c++ - 我应该在哪里重新实现 QAbstractItemModel::supportedDragActions()?