我怎么能得到#argc'和' argv'从main函数到QGLWidget

时间:2014-05-22 02:02:56

标签: c++ qt opengl qtcore qcoreapplication

我的项目中有一个类QGLWidget,这是一个opengl类,在类中我使用' argc'和' argv'类main的属性。 但我无法将这些属性传递给我的班级,有一些方法吗?

这是我的类的构造函数的一部分,使用argv和argc属性:

VideoOpenGL::VideoOpenGL(QWidget *parent) :
    QGLWidget(parent)
{

    XnStatus nRetVal = XN_STATUS_OK;

    if (argc > 1)
    {
        nRetVal = g_Context.Init();
        //CHECK_RC(nRetVal, "Init");
        nRetVal = g_Context.OpenFileRecording(argv[1], g_Player);
        if (nRetVal != XN_STATUS_OK)
        {
            printf("Can't open recording %s: %s\n", argv[1], xnGetStatusString(nRetVal));
            return;
        }
    }

和我的头文件:

class VideoOpenGL : public QGLWidget
    {
        Q_OBJECT
    public:
        explicit VideoOpenGL(QWidget *parent = 0);
        //explicit VideoOpenGL( int & argc, char ** argv );
        //void set_mainAtribs(const int & argc, char **argv);


    protected:
        //const int argc;
        //char **argv;

        // /*
        void initializeGL();
        //void resizeGL(int w, int h);
        //void paintGL();
        static void glutKeyboard (unsigned char key, int /*x*/, int /*y*/);
        static void glutDisplay(void);
        static void glutIdle (void);
        void CleanupExit();
        void LoadCalibration();
        void SaveCalibration();
      // */
    signals:

    public slots:

    };

2 个答案:

答案 0 :(得分:4)

根据您尚未提供的更精确的上下文,您有不同的实现方式。

我假设您正在使用Qt应用程序。如果没有,请尝试使用直接或间接从主函数设置的类的setter。

如果你使用Qt应用程序you could initialize the application object和主要功能的参数,那么你可以通过static arguments() method在任何地方访问它。

您还需要使用toUtf8()方法将返回的QString转换为QByteArray,然后将data()转换为char *,即:

arguments.at(1).toUtf8().data()

或者,可能更好,您可以使用the qPrintable() function。我将在下面使用它。

qPrintable(arguments.at(1))

我将亲自使用qApp来访问它,但您也可以使用QCoreApplication :: arguments()。我发现前者也更短,我是一个懒惰的程序员。 ;)

如果碰巧使用Qt应用程序,你可以写这样的东西:

的main.cpp

int main(int argc, char **argv)
{
    QApplication a(argc, argv);
    ...
    return a.exec();
}

videoopengl.cpp

VideoOpenGL::VideoOpenGL(QWidget *parent) :
    QGLWidget(parent)
{

    XnStatus nRetVal = XN_STATUS_OK;

    QStringList arguments = qApp->arguments();
    if (arguments.size() > 1)
    {
        nRetVal = g_Context.Init();
        //CHECK_RC(nRetVal, "Init");
        nRetVal = g_Context.OpenFileRecording(qPrintable(arguments.at(1)), g_Player);
        if (nRetVal != XN_STATUS_OK)
        {
            printf("Can't open recording %s: %s\n", qPrintable(arguments.at(1)), xnGetStatusString(nRetVal));
            return;
        }
    }
}

答案 1 :(得分:3)

您可以随时在应用程序的任何位置使用静态QCoreApplication::arguments()功能。