首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你这样做是错的…(翻译文)

我在Freenode网络的Qt频道上闲逛,尽我所能帮助别人。 我看到的一个常见问题(这让我同时感到害怕)与理解Qt的线程以及如何编写一些他们编写的代码有关。...人们根据他们的代码展示他们的代码或示例,我经常最终会想到: 你这样做是错的 我知道这有点大胆,或许有点挑衅,但与此同时,我不禁认为下面的(假设的)类是面向对象原则的不正确应用以及Qt的使用不正确。...moveToThread()函数告诉Qt确保从指定的线程上下文中调用事件处理程序以及扩展的信号和槽。 QThread是线程接口,所以我们告诉线程“自己”运行代码。我们也在线程运行之前进行此操作。...一个快速的网络搜索出现了这些博客中的几个,所有这些都遵循上面类中的模式: 子类QThread 添加信号和插槽以完成工作 测试代码,看到插槽没有“从正确的线程”调用 问Google,找到moveToThread...随着线程关联的增加以及对不同关联对象之间的信号和槽连接的支持,我们突然有了一种处理线程的方便方法。我们喜欢方便,我们想用它。

86140

QObject

一、 QObject概述 说到Qt,你肯定首先想到的就是信号和槽,而这就不得不提到Qobject,这次和大家分享下QObject的相关内容,并对一些内容进行代码说明,方便理解。...QObject类是Qt对象模型,Qt绝大部分类都是继承该类实现的。 该模型的核心特点是提供了一种对象之间的通讯机制——信号和槽。...你可以使用connect()将信号连接到插槽,也可以使用disconnect()来断开连接。为了避免一直通知槽函数,还可以使用blockSignals()来暂时阻塞信号。...注意,对于实现信号和插槽或属性【本次不做说明】的任何对象,Q_OBJECT宏是必须的。...Qt官方强烈建议在QObject的所有子类中都使用该宏,不论它们是否实际使用信号和插槽或属性,因为不这样做可能会导致某些奇葩的错误。我个人是不愿意解决奇葩的错误的,比较浪费精力。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Boost C++ 库 | 事件处理

    例如Qt这一模式的使用当然不仅限于GUI。一般情况下,任意对象都可以调用基于特定事件的专门函数。本章所介绍的 Boost.Signals 库提供了一个简单的方法在 C++ 中应用这一模式。...Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot),它基于以下概念:当对应的信号被发出时,相关联的插槽即被执行。...原则上,你可以把单词 '信号' 和 '插槽' 分别替换为 '事件' 和 '事件处理器'。不过,由于信号可以在任意给定的时间发出,所以这一概念放弃了 '事件' 的名字。...Boost.Function 仅限于这种情形下适用,而 Boost.Signals 则提供了多得多的方式,如关联多个函数至单个特定信号,示例如下。)...这个操作符会被自动调用,传入两个迭代器,指向某个特定信号的所有返回值。以上例子使用了标准 C++ 算法 std::min_element() 来确定并返回最小的值。

    10010

    Qt官方示例解析-Address Book-基于单个数据模型在不同视图呈现不同数据

    提要:Qt的这个示例主要讲的是使用代理模型,实现在不同的视图上面显示单个数据模型的数据 这个示例提供了一个地址簿,将联系人按照名称字母{"ABC", "DEF", "GHI", "JKL", "MNO...addEntry()函数与AddressWidget的addEntry()类似,因为这两个函数都实例化了一个AddDialog对象。...这两个信号是给菜单中的Edit Entry、Remove Entry两个Action使用的,这两个Action会根据选择的变化而进行刷新可用状态,当没有选择数据的时候,这两个Action是灰显不可用的状态...,我们还将AddressWidget的selectionChanged()信号连接到它的updateActions()插槽。...这个函数是一个插槽连接到AddressWidget的selectionChanged()信号。

    5.3K20

    Qt官方示例-摆动的文字

    它不会在经过一定时间后发出timeout()信号,而是将QTimerEvent发送到我们选择的QObject。这使QBasicTimer成为QTimer的更轻量级替代。...主要用于高度优化或性能要求较高的应用程序(例如嵌入式应用程序)。   该示例包含两个类: WigglyWidget是自定义的小部件,摇摆地显示文本。 Dialog是允许用户输入文本的对话框小部件。...我们将行编辑的textChanged()信号连接到摆动小部件的setText()槽函数,以获得与摆动小部件的实时交互。...我们将QWidget子类化,并重新实现标准的paintEvent()和timerEvent()函数以绘制和更新窗口小部件。另外,我们实现了一个公共setText()插槽,用于设置窗口的文本。   ...而QFontMetrics对象提供有关文本的字体信息。该x变量是水平位置,是表示开始绘制文本的位置。y变量是文本基线的垂直位置。计算两个变量以使文本在水平和垂直居中。

    1.8K30

    Qt5 和 OpenCV4 计算机视觉项目:1~5

    Q_OBJECT是 Qt 库提供的关键宏。 如果我们要声明一个具有自定义信号和插槽的类,或者使用 Qt 元对象系统中的任何其他功能,则必须在该类声明中或更确切地说在私有声明中并入这个关键宏。...Qt 使用信号和插槽连接机制来建立事件及其处理器之间的关系。 当用户对窗口小部件执行操作时,将发出该窗口小部件的信号。 然后,Qt 将确定​​是否有与该信号相连的插槽。...然后,我们声明一个名称为frameCapture的信号,该信号将指向Mat对象的指针作为其唯一参数。 每次从网络摄像头捕获帧时,都会发出此信号。 如果您对此信号感兴趣,可以将一个插槽连接到它。...如果计算完成,将发出捕获线程对象的fpsChanged信号。 为了接收发射的信号,我们必须将其连接到插槽。...这是通过CaptureThread::photoTaken信号与MainWindow::appendSavedPhoto插槽之间的连接完成的。

    6K10

    翻译 | 为什么QObject子类不可复制?

    其中两个最大的原因是: QObjects之间通常使用信号和槽机制进行通信。不清楚连接的信号和/或插槽是否应该转移到副本。如果它们将被转移,则意味着其他qobject将自动订阅该副本。...QObjects可以在运行时使用新的属性进行扩展。副本是否也应该继承这些新属性?   一般来说,QObjects是通过它们的指针地址被其他对象引用的。例如,前面提到的信号和槽机制就是这种情况。...Qt的文档在Qt对象模型中区分了两种对象类型:值对象和身份对象。值对象,如:QSize,QColor和QString是可被复制和分配的对象。相反,身份对象无法复制,但可以克隆。...您可能已经猜到过,身份对象的一个示例是QOBject或从其派生的任何类。克隆的含义可以从官方文档中读取: 克隆意味着创建一个新的身份,而不是旧身份的完全副本。例如,双胞胎有不同的身份。...刚接触Qt的人可以快速理解其用法:不应(也不能)复制对象!

    1K10

    QT应用编程: Qt数据类型和(ActiveX)COM接口数据类型对应关系

    /112556866 QT创建的COM组件里,类里提供的公共槽函数可以直接被其他语言调用,提供信号可以被其他语言绑定为事件,数据通信非常方便。...比如: QT如果调用已经注册的COM组件,可以绑定COM组件提供的信号到自己的指定的槽函数。...C#如果调用已经注册的COM组件,可以绑定COM组件提供的信号(事件) (QT生成的COM组件,信号传递出来的参数,在C#里接收回调函数里,从事件e结构里.号可以直接取出数据)。...private: Ui::ComPluginTestClass ui; }; ActiveQt框架将属性和公共插槽公开为ActiveX属性和方法,将信号公开为ActiveX事件,并在Qt数据类型和等效的...COM数据类型之间进行转换。

    1K30

    MIC1816R||嵌入式ARM测控一体机安装使用说明

    MIC-1816R嵌入式ARM测控一体机采用ARM Cortex-A9 i.MX6处理器,支持Ubuntu操作系统,提供Qt和C开发包、示例程序,集成4通道IEPE加速规信号采集、8通道电压电流采集、模拟输出和数字...SW2蓝色拨码开关位于下图SD卡插槽附近。...、烧录到SD(SD容量必须>=8G),建议使用Ubuntu系统,按解压会有image和scripts两个目录。...同时文件管理器中会看到SD卡出现Kernel和rootfs两个分区。 三、将SD卡插入MIC-1816R插槽,启动后进入Ubuntu桌面。...四、启动终端,进入C语言例子代码目录,使用make指令编译程序,运行(详细步骤参考“附录:Linux通用C语言示例程序使用说明”。 五、启动Qt,打开例子程序: 编译运行。

    1K30

    OpenCV3 和 Qt5 计算机视觉:11~12

    为了更好地理解这一点,首先我们需要讨论两种可能的链接类型之间的区别: 动态链接 静态链接 动态链接是链接编译器生成的对象的过程,方法是将函数的名称放在生成的可执行文件或库中,以使该特定函数的实际代码位于共享库...此处的主要区别在于,在 QML 类型内部定义的每个信号还具有为其自动生成的对应插槽,并且可以填充脚本以在发出相关信号时执行操作。 好吧,让我们看另一个例子。 QML Button类型具有按下信号。...如前所述,您可以通过大写信号名称的第一个字母并在其前面加上on来轻松猜测每个信号的插槽名称。...因此,对于pressed信号,您将有一个onPressed插槽,对于released信号,您将有一个onReleased插槽,依此类推。...由于 QML 使用相同的 Qt 元对象作为对象之间的基础通信机制,因此用Q_INVOKABLE宏标记函数就足够了,以便可以从 QML 代码中调用它。

    6.3K20

    4.6 C++ Boost 函数绑定回调库

    在bind()函数中,占位符_1表示绑定参数的位置。在本示例中,函数对象f1将my_func的第一个参数设为10,第二个参数为绑定参数。.../槽机制,它提供了类似于Qt中Signals and Slots机制的功能。...与Qt Signals and Slots机制不同的是,Boost.Signals2库不需要特定的宏或标记来识别信号和槽函数,而是通过C类型的机制实现。...由于它是一个标准的C库,并且不需要任何其他依赖,因此可以在不使用整个Qt库的情况下使用它。下面是一个简单的示例代码,实一个简单的信号和槽函数的案例,如下案例定义信号,并分别连接到两个槽函数上。...让其可以动态生成一些列插槽,演示组号与调用顺序之间的关系。

    28020

    4.6 C++ Boost 函数绑定回调库

    在bind()函数中,占位符_1表示绑定参数的位置。 在本示例中,函数对象f1将my_func的第一个参数设为10,第二个参数为绑定参数。.../槽机制,它提供了类似于Qt中Signals and Slots机制的功能。...与Qt Signals and Slots机制不同的是,Boost.Signals2库不需要特定的宏或标记来识别信号和槽函数,而是通过C类型的机制实现。...由于它是一个标准的C库,并且不需要任何其他依赖,因此可以在不使用整个Qt库的情况下使用它。 下面是一个简单的示例代码,实一个简单的信号和槽函数的案例,如下案例定义信号,并分别连接到两个槽函数上。...模板类,让其可以动态生成一些列插槽,演示组号与调用顺序之间的关系。

    25030

    Python 机器人学习手册:6~10

    Qt 信号和插槽 在 Qt 中,使用信号和插槽功能处理 GUI 事件。 当事件发生时,会从 GUI 发出信号。 Qt 小部件具有许多预定义的信号,用户可以为 GUI 事件添加自定义信号。...插槽是响应特定信号而调用的函数。 在此示例中,我们使用PushButton的clicked()信号并为此信号创建一个自定义插槽。 我们可以在此自定义函数中编写自己的代码。...此函数将在此小部件对象上添加 UI 组件,例如按钮,为信号分配插槽等。 如果需要,retranslateUi()函数会将 UI 的语言翻译成其他语言。...如何将 Qt UI 文件转换为 Python 脚本? 什么是 Qt 信号和插槽? 什么是 RQT,它的主要应用是什么?...另外,PySide 拥有许多有关其 API 的文档。 我们可以使用名为 pyuic 的 Py UI 编译器。 Qt 插槽是程序中可由 Qt 信号触发的函数。

    3.5K20

    OpenCV3 和 Qt5 计算机视觉:6~10

    通过右键单击borderTypeComboBox小部件的currentIndexChanged(int)信号添加方法,选择“转到插槽…”,选择提到的信号,然后单击“确定”按钮。...您可以检查mainapp项目的源代码,您会注意到所有插件的信号都连接到mainapp中的相关插槽,该插槽仅调用插件的processImage函数。...或者,就像在当前示例中一样,我们可能希望使用匹配来检测场景中的对象。 这样做的一种常见方法是尝试找出匹配关键点之间的单应性变化。...为了能够使用 Qt 信号和插槽对QFuture类进行更灵活的控制,我们可以使用一个名为QFutureWatcher的便捷类,该类包含可以通过使用小部件更轻松地监视计算的信号和插槽。...这是示例代码,可使用所有现有方法来计算两个图像(或两个视频帧)之间的差异: Mat img1 = imread("d:/dev/Packt/testbw1.jpg", IMREAD_GRAYSCALE

    2.7K20

    【数字信号处理】傅里叶变换性质 ( 序列对称分解定理示例 | 共轭对称序列与原序列之间的关系 | 共轭反对称序列与原序列之间的关系 )

    文章目录 一、序列对称分解定理示例 1、序列对称分解定理 2、因果序列 3、求解过程 n < 0 情况 n = 0 情况 n > 0 情况 实因果序列的对称序列与原序列关系 一、序列对称分解定理示例...x_e(n) + x_o(n) 共轭对称序列 x_e(n) 与 原序列 x(n) 之间的关系如下 : x_e(n) = 0.5[x(n) + x^*(-n)] 共轭反对称序列 x_o(n)...与 原序列 x(n) 之间的关系如下 : x_o(n) = 0.5[x(n) - x^*(-n)] 2、因果序列 ① 离散时间系统因果性 : " 离散时间系统 " n 时刻 的 " 输出 " ,...(n) + h(-n)] = 0.5 \times [0 + h(-n)] = 0.5 \times h(-n) 根据 序列对称分解定理 , 共轭对称序列 x_e(n) 与 原序列 x(n) 之间的关系...序列对称分解定理 , 共轭对称序列 x_e(n) 与 原序列 x(n) 之间的关系 , 可以得到 h_e(n) = 0.5 \times [h(n) + h(-n)] 其中 , 将 h(-n

    61920

    OpenCV3 和 Qt5 计算机视觉:1~5

    因此,从定义信号和插槽的概念开始我们的第一次相遇开始,然后再通过一个真实的示例进行体验,这是一个非常好的主意。...Qt 框架对标准 C++ 编程的最重要添加是信号和插槽机制,这也是使 Qt 如此易于学习且功能强大的原因。 这绝对也是 Qt 与其他框架之间最重要的区别。...可以将它视为 Qt 对象和类之间的消息传递方法(或顾名思义,只是发出信号)。 每个 Qt 对象都可以发出可以连接到另一个(或相同)对象中的插槽的信号。 让我们通过一个简单的例子进一步分解它。...我相信您可以想象如果将按钮的按下信号连接到窗口的关闭插槽会发生什么。 有很多方法可以将信号连接到插槽,因此,从现在开始,在本书的其余部分中,只要需要在示例中使用它们,我们就会学习它们的每一种。...因此,这基本上是创建作为QObject(或任何其他 Qt 对象)的子类的类(不仅是窗口类,而且一般是任何 Qt 类)的标准方法,该类将支持 Qt 支持的功能,例如信号和插槽。

    6K20

    OpenCV2 计算机视觉应用编程秘籍:1~5

    工作原理 在 Qt 的 GUI 编程框架下,对象使用信号和插槽进行通信。 每当窗口小部件更改状态或发生事件时,都会发出信号。...该信号具有预定义的签名,如果另一个对象想要接收该信号,则它必须定义一个具有相同签名的插槽。 因此,插槽是一种特殊的类方法,当它所连接的信号发出时会自动调用。...信号和插槽被定义为类方法,但必须在指定插槽和信号的 Qt 访问下声明。...当您在按钮上添加插槽时,这就是 Qt Creator 所做的,即: private slots: void on_pushButton_clicked(); 信号和插槽是松散耦合的,也就是说,信号不知道与连接插槽的对象有关的任何信息...GUI 模块以及信号和插槽机制的更多信息,请查阅位于这个页面的在线 Qt 文档。

    3.1K10

    JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家有么有想过main方法呢?...static对象 ,我们知道都会存放在方法区(元空间)中的运行时常量池。...Note: FIVE 是 final的,上图少写了 ---- 代码示例论证 当我们执行main方法 public static void main(String[] args) { Artisan...main也是个方法,也得有方法栈, 那方法栈中的局部变量表中存放的artisan是个啥呢? 其实是 对象的引用 ,也就是对象的内存地址 。 这样,线程栈和堆的关系就产生了。...引用的关系,方法区中的User仅仅是个符号引用,指向真正的堆内存中的User对象。 这样 方法区和堆的关系就产生了 。

    46010
    领券