【问题标题】:How to access QMainWindow from another class如何从另一个类访问 QMainWindow
【发布时间】:2021-12-29 01:06:15
【问题描述】:

// mainwindow.h

#include "ui_MainWindow.h"
#include "parseTextFile.h"

class MainWindow:public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(void);

private:
    Ui_mainWindow ui;
    parseFile *fileParse;

public slots:
    int onOkButtonClick();
};

// mainwindow.cpp

MainWindow::MainWindow(void)
{
    ui.setupUi(this);

    connect(ui.OkButton,SIGNAL(clicked()),this,SLOT(onOkButtonClick()));
}

int MainWindow::onOkButtonClick()
{
    fileParse = new parseFile(this);
    fileParse->parseTextFile();
    return 0;
}

int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
    MainWindow *mainWindow = new MainWindow();
    mainWindow->show();
    return app.exec();
}

// parseTextFile.h

class parseFile
{
public:
    parseFile(QWidget *parent =0);
    ~parseFile();

    int parseTextFile( );
};

// parseTextFile.cpp

#include "parseTextFile.h"
#include <QMessageBox>

parseFile::parseFile(QWidget *parent)
{
}

parseFile::~parseFile()
{
}

int parseFile::parseTextFile( )
{
    QMessageBox::information(this,"a","b");
    return 0;
}

我可以访问 parseTextFile 方法,但在 QMessageBox 中出现错误。这是正确的方法吗? 如何在 parseTextFile 类中打印 QMessageBox? parseTextFile 构造函数中需要添加什么?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    this 作为父级传递给 QMessageBox::information 不是有效参数,因为 parseFile 不是 QWidget 派生类。

    为了简单,只需传递 nullptr 而不是 this

    QMessageBox::information(nullptr ,"a","b");
    

    在这种情况下,消息框不属于任何人。它将被用户或应用程序退出时关闭。

    PS:你应该在使用fileParse后释放内存以避免内存泄漏。

    有几种方法可以使用主窗口(静态指针、单例、顶部小部件枚举等),但我认为您打算做的最简单的一种是将 parseFile 类作为 QObject 派生类和 QMainWindow它的父级。

    class parseFile: public QObject
    {
        Q_OBJECT
    
    public:
        parseFile(QWidget *parent =0);
        ~parseFile();
    
        int parseTextFile();
    };
    
    parseFile::parseFile(QWidget *parent)
    :QObject(parent)
    {
    }
    int parseFile::parseTextFile()
    {
        QWidget * parentWidget = qobject_cast<QWidget *>( parent() ); //<-- QMainWindow instance
    
        QMessageBox::information( parentWidget, "a", "b");
        return 0;
    }
    
    int MainWindow::onOkButtonClick()
    {
        fileParse = new parseFile(this);
        fileParse->parseTextFile( );
    
        //fileParse should be released by:
        //fileParse->deleteLater();
    
        return 0;
    }
    

    【讨论】:

    • 是的,很好。它工作正常。但是 QMessageBox 窗口没有与 QMainWindow 链接。 MessageBox 窗口在窗口中心单独显示。有什么方法可以同时链接 QMainWindow 和 QMessageBox?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2012-05-06
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多