qt designer 添加 转到槽功能

371 阅读1分钟

环境

  • qt : 6.5.1。 5.15.2

相关资源

喜欢在clion中开发 ,添加相应的槽函数是件麻烦事。所以,就有了这个功能:选择相应槽函数后,复制签名到系统剪贴板

效果:

image.png

修改的相关代码

QDesignerTaskMenu::navigateToSlot

 
#include <QApplication>
#include <QClipboard>

void QDesignerTaskMenu::navigateToSlot(QDesignerFormEditorInterface *core,
                                           QObject *object,
                                           const QString &defaultSignal) {
        SelectSignalDialog dialog;
        dialog.populate(core, object, defaultSignal);
        if (dialog.exec() != QDialog::Accepted)
            return;
        // TODO: Check whether signal is connected to slot
        const SelectSignalDialog::Method method = dialog.selectedMethod();
        if (method.isValid()) {
            QClipboard *clipboard = QApplication::clipboard();
            QString signature = method.signature;
            auto pos1 = signature.indexOf("(");
            auto pos2 = signature.lastIndexOf(")");
            QString parameterTypesText = signature.mid(pos1 + 1, pos2 - pos1 - 1);
            parameterTypesText = parameterTypesText.replace(" ", "");
            QString methodName = signature.left(pos1);
            QString methodSignText;
            if (parameterTypesText.isEmpty()) {
                methodSignText = QString("void on_%1_%2();").arg(objName(core, object), methodName);
                clipboard->setText(method.signature);
            } else {
                QStringList parameterTypes = parameterTypesText.split(",");
                QStringList parameter;
                for (int i = 0; i < parameterTypes.size(); ++i) {
                    parameter << parameterTypes.at(i) + " " + method.parameterNames.at(i);
                }
                methodSignText = QString("void on_%1_%2(%3);").arg(objName(core, object), methodName,
                                                                           parameter.join(", "));
            }
            clipboard->setText(methodSignText);
            
            core->integration()->emitNavigateToSlot(objName(core, object),
                                                    method.signature,
                                                    method.parameterNames);
        }
    }

QDesignerTaskMenu::taskActions

//    if (isSlotNavigationEnabled(formWindow->core())) {
        actions.append(d->m_separator7);
        actions.append(d->m_navigateToSlot);
//    }

注意事项:

  1. 若是5.15.2。得在qtcreator中编译。编译时如果提示缺少 vulkan。将vulkan文件夹复制到 \Qt\5.15.2\msvc2019_64\include
  2. 若是6.x.x,可在clion中编译。