从另一个类 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::instance()
,这是一个源自QCoreApplication *
的QApplication *
,源自QObject *
。那不行,它不是secondWindow *
,甚至不是QMainWindow *
,甚至不是QWidget *
。
除此之外,您的编码风格相当奇怪——在 Qt 中,习惯上使用 CamelCase
表示类,而不是 thisStuff
,后者通常适用于函数和方法。包括<read.moc>
是错误的。为什么read::m_read
是静态的?最后,两个窗口类之间的耦合以一种奇怪的方式建立起来(访问像QApplication
这样的全局内容只是为了获得对另一个窗口的引用,这种代码很难闻)。更好更明显的方法是将所有窗口包装在父对象中或显式设置依赖项,可能像这样:
MainWindow *mainWindow = new MainWindow();
SecondWindow *second = new SecondWindow(mainWindow);
UtilityWindow *utilityWin = new UtilityWindow(second);
【讨论】:
以上是关于从另一个类 c++ 访问 UI 元素的主要内容,如果未能解决你的问题,请参考以下文章