C++ 从另一个c类访问UI元素++;

C++ 从另一个c类访问UI元素++;,c++,qt,visual-c++,C++,Qt,Visual C++,我在从另一个类(使用实例)访问ui元素时遇到问题。我的应用程序中有第二个QMainWindow,我可以在secondWindow.cxx类中访问所有ui元素,但不能在read.cxx类中访问。我的代码如下所示。我的错在哪里?谢谢你的帮助 -------------------------------secondWindow.h------------------------------------ #ifndef __secondWindow_h #define __secondWindow_

我在从另一个类(使用实例)访问ui元素时遇到问题。我的应用程序中有第二个QMainWindow,我可以在secondWindow.cxx类中访问所有ui元素,但不能在read.cxx类中访问。我的代码如下所示。我的错在哪里?谢谢你的帮助

-------------------------------secondWindow.h------------------------------------

#ifndef __secondWindow_h
#define __secondWindow_h

#include "ui_secondwindow.h"

class secondWindow : public QMainWindow
{
    friend class read;
    igstkStandardClassBasicTraitsMacro(secondWindow, QMainWindow);
    Q_OBJECT

public:
    igstkStateMachineMacro();

    secondWindow();
    virtual ~secondWindow();
    void createSignalAndSlots();

public slots:
    void secondWindowTest();

protected:

private:
    Ui::secondMainWindow m_secondWindowUI;
};
#endif

-------------------------------secondWindow.cxx------------------------------------

#include "secondWindow.moc"
#include "secondWindow.h"
#include "read.h"

secondWindow::secondWindow() :m_StateMachine(this)
{
    m_secondWindowUI.setupUi(this);
    createSignalAndSlots();
}

void secondWindow::createSignalAndSlots()
{
    connect(m_secondWindowUI.pushButton1, SIGNAL(clicked()),this, SLOT(secondWindowTest()));

    connect(m_secondWindowUI.pushButton2, SIGNAL(clicked()), read::instance(), SLOT(readTest()));
}

void secondWindow::secondWindowTest()
{
    m_secondWindowUI.pushButton1->setEnabled(true); //OK
}

secondWindow::~secondWindow(){}


---------------------------------read.h--------------------------------------

#pragma once

#include "secondWindow.h"

class read : public QObject
{
    Q_OBJECT

public:
    static read *instance();
    read();
    virtual ~read() {}

public slots:
    void readTest();

protected:
    secondWindow    *m_readUI;
    static read     *m_read;

private:
};

---------------------------------read.cxx--------------------------------------
#include <read.moc>
#include "secondWindow.h"
#include "read.h"

read *read::m_read= NULL;

read::read()
{
    m_readUI = dynamic_cast<secondWindow*>( QApplication::instance() );
}

read *read::instance()
{
    if(m_read == NULL)
    m_read = new read();

    return m_read;
}

void read::readTest()
{
    m_readUI->m_secondWindowUI.qlabelTest->setText("test"); //segmentation fault
}
------------------------------------secondWindow.h------------------------------------
#如果没有第二个窗口
#定义第二窗口
#包括“ui_secondwindow.h”
类secondWindow:公共QMainWindow
{
朋友课阅读;
igstkStandardClassBasicTraitsMacro(第二个窗口,QMainWindow);
Q_对象
公众:
igstkStateMachineMacro();
第二窗口();
虚拟~secondWindow();
void createSignalAndSlots();
公众时段:
void secondWindowTest();
受保护的:
私人:
Ui::SecondMain窗口m_secondWindowUI;
};
#恩迪夫
-------------------------------secondWindow.cxx------------------------------------
#包括“secondWindow.moc”
#包括“secondWindow.h”
#包括“read.h”
secondWindow::secondWindow():m_StateMachine(此)
{
m_secondWindowUI.setupUi(此);
createSignalAndSlots();
}
void secondWindow::createSignalAndSlots()
{
连接(m_secondWindowUI.pushButton1,信号(单击()),此,插槽(secondWindowTest());
连接(m_secondWindowUI.pushButton2,信号(单击()),读取::实例(),插槽(读取测试());
}
void secondWindow::secondWindowTest()
{
m_secondWindowUI.pushButton1->setEnabled(true);//确定
}
secondWindow::~secondWindow(){}
---------------------------------读--------------------------------------
#布拉格语一次
#包括“secondWindow.h”
课堂阅读:公共QObject
{
Q_对象
公众:
静态读取*实例();
read();
虚拟~read(){}
公众时段:
void readTest();
受保护的:
第二个窗口*m_readUI;
静态读取*MU读取;
私人:
};
---------------------------------read.cxx--------------------------------------
#包括
#包括“secondWindow.h”
#包括“read.h”
read*read::m_read=NULL;
read::read()
{
m_readUI=dynamic_cast(QApplication::instance());
}
read*read::instance()
{
如果(m_read==NULL)
m_read=新读();
返回m_read;
}
void read::readTest()
{
m_readUI->m_secondWindowUI.qlabelTest->setText(“测试”);//分段错误
}

您正在铸造一个
QApplication::instance()
,它是一个
QApplication*
派生自
QCoreApplication*
派生自
QObject*
。那不行,它不是一个
secondWindow*
,甚至不是
QMainWindow*
,甚至不是
QWidget*

除此之外,您的编码风格相当奇怪——在Qt中,习惯上对类使用
CamelCase
,而不是通常应用于函数和方法的
thistuff
。包括
是错误的。为什么
read::m_read
是静态的?最后,以一种奇怪的方式设置两个窗口类之间的耦合(访问全局内容,如
QApplication
,只是为了获得对另一个窗口代码的引用)。更好、更明显的方法是将所有窗口包装在父对象中,或者显式设置依赖项,可能如下所示:

MainWindow *mainWindow = new MainWindow();
SecondWindow *second = new SecondWindow(mainWindow);
UtilityWindow *utilityWin = new UtilityWindow(second);

您在哪里初始化了m_readUI?读取图像是从哪里来的?抱歉,它应该只是“读取”而不是“读取图像”。我已经编辑过了。m_readUI在reead.h类中已初始化。它不应该是“dynamic_cast(QApplication::activeWindow());”而不是“dynamic_cast(QApplication::instance());”吗?或者QApplication类上允许检索当前活动窗口的其他方法?