MFC 如何在一个类中使用另一个类中定义的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC 如何在一个类中使用另一个类中定义的变量相关的知识,希望对你有一定的参考价值。

就好比我在a类中定义了一个public a1,同时在a中已经修改了a1 的值,比如a1 = 30。
然后我在b类中想使用a类中定义的a1,注意b类的a1值要跟着a类中a1的值的变化而变化
应该怎么解决???

参考技术A 定义A类的对象,在B类里添加A类型的对象//
在B类型的构造函数里用A类型的a1初始化B的a1
参考技术B 定义友员类啊。。将其中的一个类定义为另一个类的友员类哦!friend class B…… 参考技术C 在b类中添加一个成员变量,类型为a。追问

是这样 我在b中定义了一个函数fun( int b1),在b的事件中为该函数参数赋值 fun(a1),也就是说该参数的值是a类中的a1,然后我在a中还包含了b的头文件,因为我在a中需要创建b的类对应的对话框,按照你说的是不可以的。提示出错

追答

你的意思是这样么:a类中要创建b类的对话框,b类中有个函数的形参需要传a类的一个对象。是这样么?
如果是这样的话,可以这样做:
在B类中::#include“A.h” ,然后定义一个成员变量A a;然后在构造函数中初始化一下。
在A类中:
#include“B.h”
/*
方法1:
B b;
b.a = *this;//一般很少这样做
*/
方法2:
B b(a);//在B类中添加一个构造函数就好了。不知道懂了没。。
b.DoModal();

追问

不行 我在我的b类中一包含a的头文件就会出错,提示各种错误。

追答

额....好像是因为重复包含了额。。。。。a包含了b,b又去包含a。。。。
你在stdafx.h中包含A.H和B.h吧 ,然后去包含stdafx.h...

本回答被提问者和网友采纳

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中

【中文标题】如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中【英文标题】:How to connect widget to custom signal declared in one class while being inside of another class 【发布时间】:2014-07-28 01:58:39 【问题描述】:

简短说明: 声明了两个线程以及七个队列项。对于每个队列项,都创建了 QProgressBar,并使用队列的 setValue() 方法将它的一个实例分配给每个队列项。在 Thread 的 run() 方法内部,使用队列项的 get() 方法检索 QProgressBar 实例。虽然仍在run() 方法内部,但QProgressBar 实例连接到自定义“updateBar”信号,因此可以从正在运行的run() 方法(或任何其他线程的方法)内部更新进度条小部件。虽然代码似乎运行良好,但如果我在 MyWindow 类之外(与信号的连接是在 Thread 类内部进行的)将 QProgressBar 实例连接到 Signal 时做正确的事情,我想得到你的意见。我实施的方法是否有任何复杂性。还是我应该使用其他东西?

from PyQt4 import QtCore, QtGui
import Queue as queue

class PbWidget(QtGui.QProgressBar):
    def __init__(self, parent=None):
        super(PbWidget, self).__init__()
        self.setMinimum(1)
        self.setMaximum(100)        
        self._active = False  

    def update_bar(self, argValue):
        self.setValue(argValue)
        QtGui.qApp.processEvents()

    def closeEvent(self, event):
        self._active = False

class MyThread(QtCore.QThread):
    def __init__(self, queue, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.queue = queue
    def run(self):
        while True:
            pb = self.queue.get()
            pb.connect(self, QtCore.SIGNAL("updateBar"), pb.update_bar)
            for i in range(0,11):
                self.emit(QtCore.SIGNAL("updateBar"), i*10) 
                self.sleep(1) 
            self.queue.task_done()
            pb.disconnect(self, QtCore.SIGNAL("updateBar"), pb.update_bar)

class MyWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)
        self.queue = queue.Queue()

        cWidget = QtGui.QWidget(self)
        self.setCentralWidget(cWidget)
        self.layout = QtGui.QVBoxLayout(cWidget)
        button=QtGui.QPushButton("Sumbit Threads")
        button.clicked.connect(self.submitThreads)
        self.layout.addWidget(button)

    def submitThreads(self):
        self.threads = []
        for i in range(1, 3): 
            thread = MyThread(self.queue)
            self.threads.append(thread)            
            thread.start()

        numbers=[1,2,3,4,5,6,7]
        for number in numbers:
            pb=PbWidget()
            self.layout.addWidget(pb)
            self.queue.put(pb) 

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    window = MyWindow()
    window.resize(300, 30)
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

【参考方案1】:

既然你有这个运行,我不明白你为什么要改变。

就个人而言,我不会在线程之间传递对象(即进度小部件),因为这不会扩展到多处理、集群等,并且无法从不同线程获取/设置相同的变量同时。

我使用的替代方法是传递简单的状态消息,并在主线程中有一个 QTimer 定期检查传入队列(使用 get_nowait() ),并适当地设置接口。

例如,在 GUI init 上设置一个计时器:

    self.timer = QTimer(self)
    self.timer.timeout.connect(self.timeout)
    self.timer.start(100)

并在超时方法中:

    coming = self.incoming.get_nowait()

其中incoming 是其他线程/进程可以写入的队列。在您的情况下,数据将包含进度条标识符和进度值。当没有数据等待时,get_nowait 将引发空异常。

有趣的是,如果您直接调用 pb.update_bar() 而不是使用信号机制会发生什么?

【讨论】:

'pb.update_bar()` 导致了我从未见过的 Q 抱怨不规则崩溃。快速谷歌搜索和第一个建议是不要尝试直接从线程的run() 方法设置进度条小部件。请发布一些关于如何在这种情况下使用get_nowait() 的示例。知道这很有趣。

以上是关于MFC 如何在一个类中使用另一个类中定义的变量的主要内容,如果未能解决你的问题,请参考以下文章

在MFC中,一个类如何调用其他类的变量和函数??

如何导入和使用在另一个python程序的类中定义的变量?

如何在 MFC CDialog 类中自动删除事件处理程序?

如何在 MFC 自定义控件类中挂钩控件关闭

如何在Obj C中的另一个类中使用一个类中声明的变量

eclipse中在一个类中定义另一个类