电商网站开发怎么样,企业怎么建设网站首页,织梦 网站公告,什么推广方法是有效果的文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法 结语 1、简介
在GUI编程中#xff0c;当我们更改一个小部件时#xff0c;我们通常希望通知另一个小程序。更普… 文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法 结语 1、简介
在GUI编程中当我们更改一个小部件时我们通常希望通知另一个小程序。更普遍地说我们希望任何种类的物体都能够相互通信。例如如果用户单击“关闭”按钮我们可能希望调用窗口的Close()函数。
其他工具包使用回调实现这种通信。回调是指向函数的指针因此如果您希望处理函数通知您某个事件您可以将指向另一个函数的指针回调传递给处理函数。然后处理函数在适当的时候调用回调。虽然使用这种方法的成功框架确实存在但回调可能是非直观的并且在确保回调参数的类型正确性方面可能会遇到问题。
在Qt中我们有一种替代回调技术的方法我们使用信号和槽。当特定事件发生时会发出一个信号。Qt的小部件有许多预定义的信号但我们总是可以对小部件进行子类化以向它们添加我们自己的信号。槽是响应于特定信号而调用的函数。Qt的小部件有许多预定义的插槽但通常的做法是对小部件进行子类化并添加自己的插槽以便处理您感兴趣的信号。 信号与槽是用于对象之间的通信的这是 Qt 的核心。为此 Qt 引入了一些关键字他们是slots、signals、emit这些都不是 C关键字是 Qt 特有的这些关键字会被 Qt 的 moc转换为标准的 C语句。
连接规则 1、信号参数可以比槽函数多反之则不可以 2、 一个信号可以连接多个槽 3、多个信号可以连接到一个槽 4、一个信号可以与另一个信号连接
2、代码实现
2.1 界面菜单“转到槽”方法
在按钮上鼠标右键弹出菜单选择“转到槽…”如下 弹出小窗口选择“clicked()”后确定。 然后在文件里自动生成代码如下
mainwindow.h
private slots:void on_pushButton_clicked();mainwindow.cpp
void MainWindow::on_pushButton_clicked()
{QMessageBox::information(this, , on_pushButton_clicked);
}2.2 界面信号槽编辑器方法
打开信号槽编辑界面添加记录设置相关参数。 在mainwindow.ui界面定义文件中会自动生成对应的代码可以手动修改。
2.3 QT4.0的绑定方法
Qt4使用了SIGNAL和SLOT这两个宏将信号和槽的函数名转换成了字符串。使用字符串导致了Qt4有以下缺点一旦出现连接不成功的情况Qt 4 是没有编译错误的
connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...)));优点对所有控件都适用。 缺点书写繁琐槽函数必须在slots标签下。
1和控件有关系的信号槽
mainwindow.h
private slots:void pushButon1_clicked();mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton,SIGNAL(clicked()),this,SLOT(pushButon1_clicked()));
}void MainWindow::pushButon1_clicked()
{QMessageBox::information(this, , pushButon1_clicked);
}2和控件无关系的信号槽
mainwindow.h
signals: //信号void mySignal_1(int a);void mySignal_2(int a, float b);private slots: //槽void mySlot_1(int b);void mySlot_2(int b);mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);//信号槽connect(this,SIGNAL(mySignal_1(int)),this,SLOT(mySlot_1(int)));connect(this, SIGNAL(mySignal_2(int, float)), this, SLOT(mySlot_2(int)));
}
void MainWindow::mySlot_1(int b)
{QString str QString::number(b);QMessageBox::information(this, 1, str);
}
void MainWindow::mySlot_2(int b)
{QString str QString::number(b);QMessageBox::information(this, 2, str);
}
void MainWindow::test()
{//发送信号emit mySignal_2(5, 2.2);emit mySignal_1(123);
}注意在不进行参数传递时信号槽绑定时也是要求信号的参数数量大于等于槽函数的参数数量。这种情况一般是一个带参数的信号去绑定一个无参数的槽函数。
2.4 QT5.0之后的绑定方法
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton,QPushButton::clicked,this,::MainWindow::pushButon1_clicked);
}void MainWindow::pushButon1_clicked()
{QMessageBox::information(this, , pushButon1_clicked);
}connect()函数基于函数指针的重载形式
[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal,
const QObject *receiver,
PointerToMemberFunction method,
Qt::ConnectionType type Qt::AutoConnection)注意这是QT5中加入的一种重载形式指定信号和槽两个参数不再使用SIGNAL()和 SLOT()宏并且槽函数不再必须是使用slots关键字声明的函数可以是任意能和信号关联的成员函数。要使一个成员函数可以和信号关联那么这个函数的参数数目不能超过信号的参数数目但是并不要求该函数拥有的参数类型和信号中对应的参数类型完全一致只需要可以进行隐式转换即可。
connect(dlg, myWindwow::test1, this, myWidget::test2);2.5 C11的方法
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, QOverloadbool::of(QPushButton::clicked),this,::MainWindow::pushButon1_clicked);
}void MainWindow::pushButon1_clicked()
{QMessageBox::information(this, , pushButon1_clicked);
}2.6 lamda表达式方法
还支持C11 中的lambda表达式可以在关联时直接编写信号发射后要执行的代码。
connect(dlg, MyWindow::test1, [ ](int value){ui-label-setText(tr(获取的值是%1)arg(value));
});mainwindow.cpp
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, QOverloadbool::of(QPushButton::clicked),[](){QMessageBox::information(this, , lamda表达式绑定成功);});
}或
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);connect(ui-pushButton, QPushButton::clicked, this, [](){QMessageBox::information(this, , lamda表达式绑定成功2);});
}结语
如果您觉得该方法或代码有一点点用处可以给作者点个赞或打赏杯咖啡╮(▽)╭ 如果您感觉方法或代码不咋地//(ㄒoㄒ)//就在评论处留言作者继续改进o_O??? 如果您需要相关功能的代码定制化开发可以留言私信作者(✿◡‿◡) 感谢各位童鞋们的支持( ´ ▽´ ) ( ´ ▽´)っ