1

如果我只是从 QGraphicsView 开始,它会显示。但是如果我将 QGraphicView 放在 mainwindow.cpp 中,它会闪烁并消失??


 int main(int argc, char **argv)
 {
     QApplication a(argc, argv);

     QGraphicsView view;
     view.resize(1000, 800);
     view.show();

     return a.exec();
 }

 int main(int argc, char **argv)
 {
     QApplication a(argc, argv);

     MainWindow w;
     w.show();

     return a.exec();
 }


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPushButton *m_button1 = new QPushButton("1", this);
    m_button1->setGeometry(QRect(QPoint(100, 100), QSize(100, 100)));
    connect(m_button1, SIGNAL(released()), this, SLOT(handleButton1()));
}

void MainWindow::handleButton1()
{
    QGraphicsView view;
    view.resize(1000, 800);
    view.show();
}
4

1 回答 1

3

您已经在 handleButton1() 函数中创建了一个本地 QGraphicsView 变量,该变量将在函数完成后立即销毁,在您的第一个示例中,视图将一直存在到 main() 结束,即应用程序结束,即它存在直到您关闭应用程序。您最好的选择是使用 Qt Designer 将 QGraphicsView 放在 MainWindow 中,或者给 MainWindow 一个私有 QGraphicsView* 成员变量

如果您使用私有变量,请使用 Qts 内置的内存管理将其父级设置为 MainWindow,以便在销毁窗口时对其进行清理。

class MainWindow : QMainWindow {
    // etc...
    private:
        QGraphicsView *view;
}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
    ui->setupUi(this);

    view = new QGraphicsView(this);
    view->setGeometry(QRect(50, 50, 400, 200));
    view->show();

    // etc...
}

如果你有一个中央小部件或任何你想要 QGraphicsView 的小部件,而不是像上面那样使用“this”,你会做

view = new QGraphicsView(ui->centralWidget);
于 2013-07-23T00:30:52.940 回答