1. 程式人生 > 其它 >VS進行Qt開發時Qt Designer沒有“轉到槽”選項

VS進行Qt開發時Qt Designer沒有“轉到槽”選項

技術標籤:Qtqt

問題描述:

在使用Qt Creator進行介面設計時,只需要在控制元件上右擊便會出現“轉到槽”選項,從而可以進行槽函式的編寫與槽函式和訊號的自動連線,十分方便。但在使用VS進行Qt開發時,Qt Designer沒有這個選項。

解決方法:

1.自己定義訊號和槽並手工連線:

qvtk_demo.h:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qvtk_demo.h"

class QVTK_Demo : public QMainWindow
{
    Q_OBJECT

public
: QVTK_Demo(QWidget* parent = Q_NULLPTR)//在qvtk_demo.h中宣告訊號 //signals: // void my_signal(); //在qvtk_demo.h中宣告槽函式 private slots: void my_slot(); private: Ui::QVTK_DemoClass ui; };

qvtk_demo.cpp:

#include "qvtk_demo.h"

QVTK_Demo::QVTK_Demo(QWidget *parent)
    : QMainWindow(
parent) { ui.setupUi(this); //在qvtk_demo.cpp連線訊號和槽 connect(ui.mybutton, &QPushButton::clicked, this, &QVTK_Demo::mybutton_clicked); } //在qvtk_demo.cpp中定義槽函式 void QVTK_Demo::my_slot() { }

注意在呼叫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:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_qvtk_demo.h"

class QVTK_Demo : public QMainWindow
{
    Q_OBJECT

public:
    QVTK_Demo(QWidget* parent = Q_NULLPTR);

//自定義的槽函式
private slots:
    void on_mybutton_clicked();

private:
    Ui::QVTK_DemoClass ui;
};

qvtk_demo.cpp:

#include "qvtk_demo.h"

QVTK_Demo::QVTK_Demo(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
}

//自定義的槽函式
void QVTK_Demo::on_mybutton_clicked() 
{
    this->close();
}

但是注意此種方法新增的槽函式只能位於QVTK_Demo這個類中,才能通過

QMetaObject::connectSlotsByName(QVTK_DemoClass);

進行自動連線。