一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

问题描述:
  在使用Qt Creator进行界面设计时,只需要在控件上右击便会出现“转到槽”选项,从而可以进行槽函数的编写与槽函数和信号的自动连接,十分方便。但在使用VS进行Qt开发时,Qt Designer没有这个选项。

解决方法:
1.自己定义信号和槽并手工连接:
qvtk_demo.h:

 1 #pragma once
 2 
 3 #include <QtWidgets/QMainWindow>
 4 #include "ui_qvtk_demo.h"
 5 
 6 class QVTK_Demo : public QMainWindow
 7 {
 8     Q_OBJECT
 9 
10 public:
11     QVTK_Demo(QWidget* parent = Q_NULLPTR);
12     
13 //在qvtk_demo.h中声明信号
14 //signals:
15 //   void my_signal();
16 
17 //在qvtk_demo.h中声明槽函数
18 private slots:
19   void my_slot();
20   
21 private:
22     Ui::QVTK_DemoClass ui;
23 };

qvtk_demo.cpp:

 1 #include "qvtk_demo.h"
 2 
 3 QVTK_Demo::QVTK_Demo(QWidget *parent)
 4     : QMainWindow(parent)
 5 {
 6     ui.setupUi(this);
 7     //在qvtk_demo.cpp连接信号和槽
 8     connect(ui.mybutton, &QPushButton::clicked, this, &QVTK_Demo::mybutton_clicked);
 9 }
10 
11 //在qvtk_demo.cpp中定义槽函数
12 void QVTK_Demo::my_slot() 
13 {
14 }

注意在调用mybutton这个对象时,需要使用

ui.mybutton

而不能直接使用mybutton。

比较推荐第二种方法,既简便又不容易出现bug。

2.按照命名规则命名槽函数:

2.1内部逻辑

ui_qvtk_demo.h中的setupUint( ) 函数末尾存在

QMetaObject::connectSlotsByName(QVTK_DemoClass);

这个函数的原始形式为

void QMetaObject::connectSlotsByName(QObject *object);

此函数会递归搜索给定对象(此处是QVTK_DemoClass)的所有子对象,并将来自它们的匹配信号连接到遵循一定命名规则的此给定对象的槽函数。读起来是不是有一点晕,可以参考以下Qt官方的原文:

 2.2命名规则

void on_<object name>_<signal name>(<signal parameters>):

<>括号中的内容就是需要用户确定的内容,分别是发出信号的子对象(子控件)的名字,发出的信号的名字和信号函数的参数。

2.3实例

只需分别在qvt_demo.h和qvt_demo.cpp文件中添加自定义槽函数的声明和定义即可。
qvt_demo.h:

 1 #pragma once
 2 
 3 #include <QtWidgets/QMainWindow>
 4 #include "ui_qvtk_demo.h"
 5 
 6 class QVTK_Demo : public QMainWindow
 7 {
 8     Q_OBJECT
 9 
10 public:
11     QVTK_Demo(QWidget* parent = Q_NULLPTR);
12 
13 //自定义的槽函数
14 private slots:
15     void on_mybutton_clicked();
16 
17 private:
18     Ui::QVTK_DemoClass ui;
19 };

qvtk_demo.cpp:

 1 #include "qvtk_demo.h"
 2 
 3 QVTK_Demo::QVTK_Demo(QWidget *parent)
 4     : QMainWindow(parent)
 5 {
 6     ui.setupUi(this);
 7 }
 8 
 9 //自定义的槽函数
10 void QVTK_Demo::on_mybutton_clicked() 
11 {
12     this->close();
13 }

但是注意此种方法添加的槽函数只能位于QVTK_Demo这个类中,才能通过

QMetaObject::connectSlotsByName(QVTK_DemoClass);

进行自动连接。

posted on 2024-01-31 11:33  一杯清酒邀明月  阅读(632)  评论(0编辑  收藏  举报