精华内容
下载资源
问答
  • #include "mythread1.h" #include #include #include //int i = 0; //共享资源 QMutex mutex;... qDebug() 命令执行成功!...代码如上,程序不会执行槽函数recvserialdata(),只执行run函数里的语句。
  • 用槽信号取socket的流,槽函数里能debug出来,但是在外面就能用了。 ``` void RtspThread::recvData() { connect(socket,SIGNAL(readyRead()),this,SLOT(sockRecvData()));//有码流过来执行sockRecvData函数 ...
  • 我的代码如下: MyDialog::MyDialog(QWidget *parent) : QDialog(parent), ...MyDialog是一个对话框,在外面被以模态exec()调用,2.4s后自动关闭,为什么槽函数没有立即执行,而是先执行输出hh才输出we?
  • 如图,最近遇到这么个问题,想将写日志信息放到一个单独的线程中去执行,然而添加movetothread后程序就进入槽函数了,第一想到的就是检查语法规范,然而,注释图中第三行代码发现,可以执行,显然,语法是没任何...

    如图,最近遇到这么个问题,想将写日志信息放到一个单独的线程中去执行,然而添加movetothread后程序就不进入槽函数了,第一想到的就是检查语法规范,然而,注释图中第三行代码发现,可以执行,显然,语法是没任何问题的了。这就有点奇怪了,于是单步调试发现如下图

    这个提示就很明显了,原来是参数未注册元对象的问题。那好注册一下试试呗,成功了,打印下线程信息安心呗,果然意料之中。

    总结qt的这个信号槽,坑还是有的,要想避免还是得多调试,不怕编译错误就怕运行错误啊。

    展开全文
  • Qt 信号连接多个槽函数 执行顺序

    千次阅读 2018-07-12 19:57:36
    执行顺序 同一信号连接多个槽呢,槽函数执行没有绝对的先后顺序。如:connect(slider,&QSlider::valueChanged, spin_box,&QSpinBox::setValue);connect(slider,&QSlider::valueChanged, ...
    执行顺序
       同一信号连接多个槽呢,槽函数执行没有绝对的先后顺序。
    如:
    connect(slider,&QSlider::valueChanged, spin_box,&QSpinBox::setValue);
    connect(slider,&QSlider::valueChanged, this,&QWidget::showValue);
       在Qt5之前,并不是setValue一定会比showValue先执行。
       但在Qt5中,文档中这样介绍:
    A signal can be connected to many slots and signals. Manysignals can be connected to one slot.
    If a signal is connected to several slots, the slots areactivated in the same order in which the connections were made,when the signal is emitted.(一个信号连接多个槽,信号发射后,会按照链接顺序执行)。
        经过简单测试的确如此:
    Qt之信号与槽
    Qt之信号与槽
    展开全文
  • 1 自定义槽函数其实难,没什么好说的,注意以下几点便可。 自定义参函数注意事项(Qt5): * 1)自定义槽函数可以是类成员函数(用得最多)、全局普通函数、静态函数。 * 2)槽函数返回值、参数类型要与信号一致(槽函数...

    05黑马QT笔记之自定义槽函数

    1 自定义槽函数其实不难,没什么好说的,注意以下几点便可。
    自定义参函数注意事项(Qt5):
    * 1)自定义槽函数可以是类成员函数(用得最多)、全局普通函数、静态函数。
    * 2)槽函数返回值、参数类型要与信号一致(槽函数的尾部可以少于信号 但前面的必须相同)。
    * 3)由于信号返回值为空void,所以槽函数也肯定没有返回值。

    例子:需要实现:按下close按钮,执行自定义槽函数将按钮的close文本换成hello。released信号表示按钮释放时发送信号。

    2 代码实现:
    1)项目文件(基本一样):

    #-------------------------------------------------
    #
    # Project created by QtCreator 2020-04-21T21:25:36
    #
    #-------------------------------------------------
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = 05_SelfDefine_SignalSolt
    TEMPLATE = app
    
    # The following define makes your compiler emit warnings if you use
    # any feature of Qt which as been marked as deprecated (the exact warnings
    # depend on your compiler). Please consult the documentation of the
    # deprecated API in order to know how to port your code away from it.
    DEFINES += QT_DEPRECATED_WARNINGS
    
    # You can also make your code fail to compile if you use deprecated APIs.
    # In order to do so, uncomment the following line.
    # You can also select to disable deprecated APIs only up to a certain version of Qt.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    
    SOURCES += main.cpp\
            mywidget.cpp
    
    HEADERS  += mywidget.h
    
    

    2)类的头文件:

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    #include<QPushButton>
    
    class MyWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        MyWidget(QWidget *parent = 0);
        ~MyWidget();
    
        void mySolt();
    
    private:
        QPushButton *b1;
    };
    
    #endif // MYWIDGET_H
    
    

    3)类的实现.cpp文件:

    #include "mywidget.h"
    
    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        b1=new QPushButton(this);
        b1->setText("close");
    
        /*自定义参函数注意事项(Qt5):
         * 1)自定义槽函数可以是类成员函数(用得最多)、全局普通函数、静态函数。
         * 2)槽函数返回值、参数类型要与信号一致(槽函数的尾部可以少于信号 但前面的必须相同)。
         * 3)由于信号返回值为空void,所以槽函数也肯定没有返回值。
        */
    
        //需要实现:按下close按钮 执行自定义槽函数将close换成hello released信号表示按钮释放时发送信号
        connect(b1,&QPushButton::released,this,&MyWidget::mySolt);
    
    }
    
    //自定义槽函数
    void MyWidget::mySolt(){
       b1->setText("hello");
    }
    
    MyWidget::~MyWidget()
    {
    
    }
    
    

    4)主函数:

    #include "mywidget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MyWidget w;
        w.show();
    
        return a.exec();
    }
    
    
    展开全文
  • Lambda基本语法简单来说,Lambda函数也就是一个匿名函数,类似于object -c里面的一个代码块block语法,能够在调用语句后面马上列出要执行的代码,需要预先声明。它的语法定义如下:[capture](parameters) mutable-...

    Lambda基本语法

    简单来说,Lambda函数也就是一个匿名函数,类似于object -c里面的一个代码块block语法,能够在调用语句后面马上列出要执行的代码,不需要预先声明。它的语法定义如下:

    [capture](parameters) mutable->return-type{statement} 

    1.[capture]:捕捉列表。捕捉列表总是出现在Lambda函数的开始处。实际上,[]这对方括号被称为Lambda表达 式引入符。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用;

    2.(parameters):参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”一起省略;

    3.mutable:mutable修饰符。默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空);

    4.->return-type:返回类型。用追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导;

    5.{statement}:函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

    与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据。具体地,捕捉列表描述了上下文中哪些数据可以被Lambda使用,以及使用方式(以值传递的方式或引用传递的方式)。语法上,在“[]”包括起来的是捕捉列表,捕捉列表由多个捕捉项组成,并以逗号分隔。捕捉列表有以下几种形式:

    1.[var]表示值传递方式捕捉变量var;2.[=]表示值传递方式捕捉所有父作用域的变量(包括this);3.[&var]表示引用传递捕捉变量var;4.[&]表示引用传递方式捕捉所有父作用域的变量(包括this);5.[this]表示值传递方式捕捉当前的this指针。

    上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda表达式的那段代码块。上面的捕捉列表还可以进行组合,例如:

    1.[=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;2.[&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

    不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

    3.[=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;

    4.[&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

    在QT5 connect函数中的应用:

    我们都知道Qt5中允许信号和槽的参数数目不一致:槽函数的参数数目可以比信号的参数少。这是因为,我们信号的参数实际是作为一种返回值。正如普通的函数调用一样,我们可以选择忽略函数返回值,但是不能使用一个并不存在的返回值。如果槽函数的参数数目比信号的多,在槽函数中就使用到这些参数的时候,实际这些参数并不存在(因为信号的参数比槽的少,因此并没有传过来),函数就会报错。

    然而,有一种情况,槽函数的参数可以比信号的多,那就是槽函数的参数带有默认值。比如,我们的Newspaper和Reader有下面的代码:

    // Newspaper
    signals:
        void new Paper(const QString& name);
    // Reader
        void receiveNewspaper(const QString& name,const QDate& date=QDate::currentDate());

    虽然Reader::receiveNewspaper()的参数数目比Newspaper::newPaper()多,但是由于Reader::receiveNewspaper()后面一个参数带有默认值,

    所以该参数不是必须提供的。但是,如果你按照下面的写法,比如如下的代码:

    connect(&newspaper,
            static_cast<void (Newspaper:: *)(const QString &)>(&Newspaper::newPaper),
            &reader,
            static_cast<void (Reader:: *)(const QString &, const QDate & = QDate::curentDate())>(&Reader::receiveNewspper));

    你会得到一个断言错误:The slot requires more arguments than the signal provides.

    我们不能在函数指针中使用函数参数的默认值。这是 C++ 语言的限制:参数默认值只能使用在直接地函数调用中。当使用函数指针取其地址的时候,默认参数是不可见的!
    当然,此时你可以选择 Qt 4 的连接语法。如果你还是想使用 Qt 5 的新语法,目前的办法只有一个:Lambda 表达式。

    于是,我们的代码就变成了:

    connect(&newspaper,
            static_cast<void(Newspaper::*)(const QString&)>(&Newspaper::newPaper),
             [=](const QString& name){/* Your code here. */});
    此时信号发出后没有接收者,只执行Lambda表达式这个匿名函数里的操作。这也是connect函数的一个重载,最后一个参数是 Functor 类型。
    这个类型可以接受 static 函数、全局函数以及 Lambda 表达式。
    展开全文
  • Qt 槽函数的使用

    2014-08-25 09:34:00
    今天在代码中遇到这样一个问题,自己感觉槽和函数都写的没错,但是就是不执行槽函数,因为是一个定时器的使用,即定时时间到了就执行槽函数。 1 SeventhWizardPage::SeventhWizardPage(QWidget *parent) : 2 ...
  • 甚至根本用到信号/槽编辑器,Designer仅仅只是用来画控件,直接在逻辑代码里添加信号和槽函数就完事了 #控件名称.信号事件.connect(槽函数) self.Button.clicked.connect(self.Sum) #槽函数定义 def Sum(self)...
  • 最近在开发中遇到一个很奇怪的问题 ,槽函数与信号连接后,在代码执行中发出信号,槽函数始终进去。一开始认为是connect调用传参不对,打了下返回值是true,而且在输出中也没有相关warnning输出。再一看跨线程信号...
  • QT中的信号和槽函数

    2020-04-09 18:33:52
    信号和槽是Qt中自行定义的一种通信机制,实现对象之间的交互,当某个对象发生改变时将会发送信号,该信号可以被其它对象接收,接收以后将执行一个指定的成员函数(槽函数). 图解: 2 定义 1)包含信号或槽的类...
  • 我有一个梦想,我写的代码,可以像诗一样优美。我有一个梦想,我做的设计,能恰到好处,既过度,也无不足。 如题,Qt发射了一次信号,关联的槽函数执行了多次。
  • Qt自动产生的槽函数

    2012-07-17 15:14:10
    如果用on_XXX_clicked()定义Qt的元对象QMetaObject会自动的寻找相关的信号并链接,能再用connect()链接了,否则就会连接两次。 void QMetaObject::connectSlotsByName ( QObject * object ) [static] 这个也...
  • QToolBar *toolBar =addToolBar(tr("Tool")); QToolButton *btnZoomIn = new QToolButton( toolBar ); btnZoomIn->setText( "ZomIn" );...小弟我咨询下各位大神,我这段代码为啥不执行信号和槽函数
  •  Qt使用信号与槽机制进行对象间的通信,当某个对象的状态发生变化时,该对象会触发一个信号,该信号和另外一些对象的槽函数绑定,信号的触发将导致执行这些槽函数,这些槽函数将处理第一个对象状态的变化,完成对象...
  • 我们可能会遇到这样一个问题,当有很多信号链接在同一个槽函数时,当执行槽函数时并知道当前是谁触发了这个槽函数,此时我们需要用QObject::Sender()这个函数,在槽函数中查看触发该槽函数的Object指针,进而找出...
  • QT】多个信号 关联 同一个 槽函数

    万次阅读 多人点赞 2018-07-12 15:39:01
    背景:多个信号需要执行同一个函数或者一类函数的时候,可以选择每个信号创建一个槽函数去实现功能,如果直接关联到一个函数中,该函数只能执行一份功能,有时候并能满足业务需求在多个信号绑定到同一个槽函数的...
  • QT信号和

    2020-09-18 09:41:58
    槽函数(普通函数),只接收不管通讯 QObject来绑定信号和槽 二、QT信号槽的原理 绑定信号函数和槽函数 调用信号函数(将信号写入队列) 主线程从队列中获取信号 三、信号槽的处理主循环 QApplication a(argc, ...
  • 概念: 注意:上面connect连接 使用的是QT5中的形式,信号与槽写参数,...2、一个信号可连接多个槽函数,多个槽函数随机执行。 3、多个信号可连接同一个槽函数。 4、槽函数可以使用Lambda表达式(c++11)。 ...
  • 连接的时候用点击设置按钮,执行槽函数, void Ui_initface::set_clicked() { Ui_Dialog udialog; udialog.setupUi(dialog); dialog->show(); } 显示设置窗口,其中保存按钮的槽函数点击不执行。 ...
  • Qt-信号

    2021-01-07 17:24:42
    2.Qt::DirectConnection:信号的发送者与信号的接收者在同一线程中执行,当发出信号后,会马上进入槽函数,看上去就像在信号 发送位置调用了槽函数,在多线程下会比较危险,容易造成崩溃。 3.Qt::QueuedConnection:...
  • 今天要在线程中处理文件上传,继承QThread后在run里面执行上传操作,发现线程中的网络请求根本没有响应,根据log判断,post请求已经发起,但是后台和抓包都看到请求。 经过一番查询,发现QThread的run函数本来...
  • Qt信号与的五种连接方式

    千次阅读 2020-10-13 09:43:20
    3.队列连接: 槽在哪就在哪个线程执行 (槽函数不会立刻执行,等到接受者的当前执行的函数执行完才会执行槽函数) 4.阻塞队列连接: (槽函数调用时机和队列连接一样,只是会在发送者所在的线程会阻塞,直到槽函数...
  • Qt信号与机制理解

    2019-10-31 17:13:44
    connect和commit的使用者必须继承QObject,同一个线程中不会用到这种机制,在不同线程中,信号到达的顺序会被保存,依次调用各个槽函数实现,执行的线程是槽函数所在的线程,所以需要在槽函数中设置同步。...
  • QT中connect和disconnect用法总结 ...当conncet最后一个参数写时,connect多少次,槽函数执行多少次,本人遇到的bug需要将最后一个参数设为Qt::UniqueConnection,避免多次连接,只连接一次。 根据
  • 这就在dialog的子类里的窗口上能绘图,-----但是在相关按钮中创建对象,然后在dialog的子类窗口就能绘图,发现paintevent没有调用,这是为什么呢,是不是画图类B的对象必须在窗口类的构造函数中创建啊?...
  • 在子线程的run函数发送了一个信号,在主函数中定义了一个信号槽函数用来响应这个信号,但是槽函数不执行,修改了connect的第五个选项也不行,编译也没有问题 解决方法: 子线程在主函数的构造函数中实例化,...
  • 调试时发现有些信号发射了,但是与之相关的槽函数没有执行的原因,目前遇到的有: 1.语法错误 仔细检查格式是不是对的,然后参数是否对应 2.一个类中的信号与另一个类中的槽函数 在SIGNAL()和SLOT()中的括号...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 180
精华内容 72
关键字:

qt不执行槽函数