在qt creator中如何删除建立好的讯号和槽

在qt creator中如何删除建立好的讯号和槽,第1张

在qt creator中如何删除建立好的讯号和槽 在介面最下面的视窗上,可以修改和删除

Qt的讯号和槽是如何工作的

简单点说就是当你发射一个讯号,Qt的讯号槽机制会自动把你这个讯号触发到关联的槽函式上面去,当然一个讯号可以关联多个槽函式(槽函式用Q_SLOT区别的函式),然后在你的槽函式里面就触发了执行。

给你2个参考文件一个英文的,一个中文的

:woboq./blog/how-qt-signals-slots-work.

:blog.csdn./newthinker_wei/article/details/22785763

如何删除phpstorm中建立好的专案

确认你已经安装php开发环境,没安装的话,安装一个整合环境也可以的,php+apache/nginx+mysql这样的

这样设定一下就行

在DLL中使用QT的讯号和槽,在JAVA中不能用吗

一:开启腾讯电脑管家,找到工具箱-电脑诊所。

二:点选软体问题专区。

三:在丢失dll档案一键修复区,找要修复的dll档案选项。

四:点选立即修复,便可以恢复正常了

QT 讯号和槽式如何实现的

一: [ 每个物件 ] 都有一个相应的纪录该物件的 [ 元物件 ]

关于元物件的类:

QMetaObject 类:

/******************* 生成元物件需要的输入引数 *****************/

类名

const char * const class_name,

父类名

QMetaObject *superclass,

记录 slot 资讯

const QMetaData * const slot_data,

记录槽的个数

int n_slots,

记录 signal 资讯

const QMetaData * const signal_data,

记录讯号的个数

int n_signals

/******************* 元物件类提供的方法 **************************/

int numSlots( bool super = FALSE ) const返回槽的个数

int numSignals( bool super = FALSE ) const返回讯号的个数

int findSlot( const char *, bool super = FALSE ) const查询槽

int findSignal( const char *, bool super = FALSE ) const查询讯号

返回指定位置的槽

const QMetaData *slot( int index, bool super = FALSE ) const

返回指定位置的讯号

const QMetaData *signal( int index, bool super = FALSE ) const

所有槽名字的列表

QStrList slotNames( bool super = FALSE ) const

所有讯号名字的列表

QStrList signalNames( bool super = FALSE ) const

槽的起始索引

int slotOffset() const

讯号的起始索引

int signalOffset() const

/*********************** 两个获取类的元物件的方法 *****************/

static QMetaObject *metaObject( const char *class_name )

static bool hasMetaObject( const char *class_name )

QMetaData 类:

记录元物件资料 for 讯号与槽

struct QMetaData

{

const char *name 名称

const QUMethod* method 详细描述资讯

enum Aess { Private, Protected, Public }

Aess aess 访问许可权

}

二: [QObject 类实现了讯号与槽机制 ]

它利用元物件纪录的资讯,实现了讯号与槽机制

( 1 )讯号与槽建立连线的实现

介面函式:

连线

引数(传送物件,讯号,接收物件,处理讯号的讯号 / 槽)

static bool connect( const QObject *sender, const char *signal,

const QObject *receiver, const char *member )

bool connect(const QObject *sender, const char *signal,

const char *member ) const

static bool disconnect( const QObject *sender, const char *signal,

const QObject *receiver, const char *member )

bool disconnect(const char *signal=0,

const QObject *receiver=0, const char *member=0 )

bool disconnect( const QObject *receiver, const char *member=0 )

连线的内部实现

(传送物件,讯号的索引,接收物件,处理讯号的型别,处理讯号讯号 / 槽的索引)

static void connectInternal(const QObject *sender, int signal_index,

const QObject *receiver, int membcode, int member_index )

static bool disconnectInternal(const QObject *sender, int signal_index,

const QObject *receiver, int membcode, int member_index )

讯号与槽连线的实现原理:

① 阶段

bool QObject::connect( const QObject *sender, 传送物件

const char *signal, 讯号

const QObject *receiver, 接收物件

const char *member 槽

)

{

检查传送物件,讯号,接收物件,槽不为 null

if ( sender == 0 || receiver == 0 || signal == 0 || member == 0 ) {

return FALSE

}

获取传送物件的元物件

QMetaObject * *** eta = sender->metaObject()

检查讯号

if ( !check_signal_macro( sender, signal, "connect", "bind" ) )

return FALSE

获取讯号的索引

int signal_index = *** eta->findSignal( signal, TRUE )

if ( signal_index <0 ) { normalize and retry

nw_signal = qt_rmWS( signal-1 ) remove whitespace

signal = nw_signal.data()+1 skip member type code

signal_index = *** eta->findSignal( signal, TRUE )

}

如果讯号不存在,则退出

if ( signal_index <0 ) { no such signal

return FALSE

}

获取讯号的元资料物件

const QMetaData * *** = *** eta->signal( signal_index, TRUE )

获取讯号名字

signal = *** ->name

获取处理讯号的型别(是讯号 / 槽)

int membcode = member[0] - '0' get member code

传送讯号物件

QObject *s = (QObject *)sender we need to change them

接收讯号物件

QObject *r = (QObject *)receiver internally

获取接收物件的元物件

QMetaObject *rmeta = r->metaObject()

int member_index = -1

switch ( membcode ) { get receiver member

case QSLOT_CODE: 如果是槽

获取槽索引

member_index = rmeta->findSlot( member, TRUE )

if ( member_index <0 ) { normalize and retry

nw_member = qt_rmWS(member) remove whitespace

member = nw_member

member_index = rmeta->findSlot( member, TRUE )

}

break

case QSIGNAL_CODE: 如果是讯号

获取讯号索引

member_index = rmeta->findSignal( member, TRUE )

if ( member_index <0 ) { normalize and retry

nw_member = qt_rmWS(member) remove whitespace

member = nw_member

member_index = rmeta->findSignal( member, TRUE )

}

break

}

/ 如果接收物件不存在相应的讯号或槽,则退出

if ( member_index <0 ) {

return FALSE

}

检查连线的引数 ( 传送的讯号,接收物件,处理讯号的槽或讯号 )

if ( !s->checkConnectArgs(signal,receiver,member) ) {

return FALSE

} else {

获取处理讯号的元资料物件

const QMetaData *rm = membcode == QSLOT_CODE ?

rmeta->slot( member_index, TRUE ) :

rmeta->signal( member_index, TRUE )

if ( rm ) {

建立连线

( 传送讯号的物件,讯号的索引,接收讯号的物件,

处理讯号的型别,处理讯号的索引 )

connectInternal( sender, signal_index, receiver, membcode, member_index )

}

}

return TRUE

}

② 阶段

建立连线

( 传送讯号的物件,讯号的索引,接收讯号的物件,处理讯号的型别,处理讯号的索引 )

void QObject::connectInternal( const QObject *sender, int signal_index,

const QObject *receiver,

int membcode, int member_index )

{

传送讯号的物件

QObject *s = (QObject*)sender

接收讯号的物件

QObject *r = (QObject*)receiver

如果传送物件的连线查询表为 null ,则建立

if ( !s->connections ) { create connections lookup table

s->connections = new QSignalVec( signal_index+1 )

Q_CHECK_PTR( s->connections )

s->connections->setAutoDelete( TRUE )

}

获取传送物件的相应讯号的连线列表

QConnectionList *clist = s->connections->at( signal_index )

if ( !clist ) { create receiver list

clist = new QConnectionList

Q_CHECK_PTR( clist )

clist->setAutoDelete( TRUE )

s->connections->insert( signal_index, clist )

}

QMetaObject *rmeta = r->metaObject()

const QMetaData *rm = 0

switch ( membcode ) { get receiver member

case QSLOT_CODE:

rm = rmeta->slot( member_index, TRUE )

break

case QSIGNAL_CODE:

rm = rmeta->signal( member_index, TRUE )

break

}

建立连线

QConnection *c = new QConnection( r, member_index, rm ? rm->name :

"qt_invoke", membcode )

Q_CHECK_PTR( c )

把连线新增到传送物件的连线列表中

clist->append( c )

判断接收物件的传送物件列表是否为 null

if ( !r->senderObjects ) create list of senders

{

建立接收物件的传送物件列表

r->senderObjects = new QSenderObjectList

}

把传送物件新增到传送物件列表中

r->senderObjects->append( s ) add sender to list

}

( 2 )讯号发生时启用的 *** 作函式

介面:

/***************************************************************

** 启用 slot 的方法

****************************************************************/

void QObject::activate_signal( int signal )

{

#ifndef QT_NO_PRELIMINARY_SIGNAL_SPY

if ( qt_preliminary_signal_spy ) {

讯号没有被阻塞

讯号 >=0

连线列表不为空,或者讯号对应的连线存在

if ( !signalsBlocked() &&signal >= 0 &&

( !connections || !connections->at( signal ) ) ) {

QUObject o[1]

qt_spy_signal( this, signal, o )

return

}

}

#endif

if ( !connections || signalsBlocked() || signal <0 )

return

获取讯号对应的连线列表

QConnectionList *clist = connections->at( signal )

if ( !clist )

return

QUObject o[1]

activate_signal( clist, o )

}

/***************************************************************

** 启用 slot 的方法

****************************************************************/

void QObject::activate_signal( QConnectionList *clist, QUObject *o )

{

if ( !clist )

return

#ifndef QT_NO_PRELIMINARY_SIGNAL_SPY

if ( qt_preliminary_signal_spy )

qt_spy_signal( this, connections->findRef( clist), o )

#endif

QObject *object

传送物件列表

QSenderObjectList* sol

旧的传送物件

QObject* oldSender = 0

连线

QConnection *c

if ( clist->count() == 1 ) { save iterator

获取连线

c = clist->first()

object = c->object()

获取传送物件列表

sol = object->senderObjects

if ( sol ) {

获取旧的传送物件

oldSender = sol->currentSender

sol->ref()

设定新的传送物件

sol->currentSender = this

}

if ( c->memberType() == QSIGNAL_CODE ) 如果是讯号,则传送出去

object->qt_emit( c->member(), o )

else

object->qt_invoke( c->member(), o )如果是槽,则执行

if ( sol ) {

设定恢复为旧的传送物件

sol->currentSender = oldSender

if ( sol->deref() )

delete sol

}

} else {

QConnection *cd = 0

QConnectionListIt it(*clist)

while ( (c=it.current()) ) {

++it

if ( c == cd )

continue

cd = c

object = c->object()

*** 作前设定当前传送物件

sol = object->senderObjects

if ( sol ) {

oldSender = sol->currentSender

sol->ref()

sol->currentSender = this

}

如果是讯号,则传送出去

if ( c->memberType() == QSIGNAL_CODE ){

object->qt_emit( c->member(), o )

}

如果是槽,则执行

else{

object->qt_invoke( c->member(), o )

}

*** 作后恢复当前传送物件

if (sol ) {

sol->currentSender = oldSender

if ( sol->deref() )

delete sol

}

}

}

}

QT怎么重写按钮的讯号和槽传递引数

connect(button,SIGNAL(clicked(button->text())),this,SLOT(get(button->text())))

我想重写个类继承QPushButton,实现讯号和槽带按钮的文字,我不知道该怎么重写这个类,能帮我用程式码具体实现下么,和怎么呼叫这个自己的button类

更多0

qt里面的讯号和槽是什么东西?

个人观点:

GUI程式基本都是事件触发的,只是时间传递的实现方法各不相同。

Windows里面用的是讯息,回拨函式,Qt用的是讯号和槽,GTK+用的是回拨函式。

希望能解决您的问题。

如何用c++模拟qt 讯号和槽机制

说明:

写一个测试程式测试qml和c++利用讯号槽机制传输资讯.

测试程式功能:16进位制和10进位制互相转换.

原始码:

main.cpp

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include <qtgui qguiapplication="">

#include qtquick2applicationviewer.h

#include <qtqml qqmlcontext="">

#include <qtquick qquickitem="">

#include <qtquick qquickview="">

#include myclass.h

int main(int argc, char *argv[])

{

QGuiApplication app(argc, argv)

MyClass my

QtQuick2ApplicationViewer viewer

viewer.setMainQmlFile(QStrin

如何在实况足球中删除自己已建立好的球员。

首先,你确定他有没有被注册进国家队,如果就换掉他,这样到建立球员选单中按W删除他

Qt怎样连线讯号和槽

假定ui中有QPushButton的物件pushButton_open以及.h/.cpp(类名为:Test)定义一个槽函式pushButton_open_onClicked()使用connect(ui.pushButton_open, &QPushButton::clicked, this, &Test::pushButton_open_onClicked)或者使用connect(ui.pushButton_open, SIGNAL(clicked()), this, SLOT(pushButton_open_onClicked()))完成连线

QMetaObject::connectSlotsByName: No matching signal for on_pushButton_clicked()

他这句话的意思是,你之前UI创建了一个pushButton的按钮,而且选择了关联槽,之后你将该pussButton给删除了或者改了名字,此时系统找不到改pushButton进行信号关联 *** 作,因此会提示你这个错误,你类里面关于该函数的函数删除就行了,记得是类定义里面的。

调用clear方法清理。

clear方法这是一种用来清除数据消除信息的指令,想要清除qtlistview的全部数据,即可通过输入调用clear方法清理所有的数据。

在清除数据的时候,要选择需要删除的数据进行清除,否则可能会导致数据删除错误,导致数据的丢失。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11898803.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存