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

如题所述

在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())); 完成连线
温馨提示:答案为网友推荐,仅供参考
相似回答