0

別のクラス (インスタンスを使用) から ui 要素にアクセスする際に問題があります。アプリケーションに 2 番目の 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
}
4

1 に答える 1

0

をキャストしています。QApplication::instance()これは、から派生したQApplication *からQCoreApplication *派生したものQObject *です。それはうまくいきませsecondWindow *ん。QMainWindow *QWidget *

それとは別に、あなたのコーディング スタイルはかなり奇妙です。Qt では、通常は関数やメソッドに適用されるのではCamelCaseなく、クラスに使用するのが通例です。thisStuff含める<read.moc>のは間違っています。なぜread::m_read静的ですか?最後に、2 つのウィンドウ クラス間の結合は奇妙な方法でセットアップされます (QApplication別のウィンドウへの参照を取得するためだけにグローバルなものにアクセスするのは、醜いコードのにおいがします)。はるかに優れたより明白なアプローチは、すべてのウィンドウを親オブジェクトでラップするか、依存関係を明示的に設定することです。おそらく次のようになります。

MainWindow *mainWindow = new MainWindow();
SecondWindow *second = new SecondWindow(mainWindow);
UtilityWindow *utilityWin = new UtilityWindow(second);
于 2013-04-11T21:11:44.393 に答える