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

Posted

技术标签:

【中文标题】从另一个类 c++ 访问 UI 元素【英文标题】:Access UI elements from another class c++ 【发布时间】:2013-04-11 18:05:21 【问题描述】:

我在从另一个类(带有实例)访问 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 is not a good identifier name. 你在哪里初始化了 m_readUI? readCTImages 是从哪里来的? 抱歉,它应该只是“读取”而不是“读取CTImages”。我已经编辑过了。 m_readUI 在 reead.h 类中初始化。 不应该是“dynamic_cast(QApplication::activeWindow());”而不是“dynamic_cast(QApplication::instance());” ?或者 QApplication 类上允许检索当前活动窗口的其他方法? 【参考方案1】:

您正在投射一个QApplication::instance(),这是一个源自QCoreApplication *QApplication *,源自QObject *。那不行,它不是secondWindow *,甚至不是QMainWindow *,甚至不是QWidget *

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

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

【讨论】:

以上是关于从另一个类 c++ 访问 UI 元素的主要内容,如果未能解决你的问题,请参考以下文章

您可以从另一个线程访问 UI 元素吗? (不设置)

Qt5从另一个类访问ui [重复]

从另一个类访问 viewController 元素

从另一个线程访问 UI 线程的视图

如何从另一个模块访问测试类以在 junit 测试中使用?

c ++从另一个类语法访问类字段