qt信号槽之创建和连接自定义的槽

2023-11-14

在第一版的Qt设计器中,你可以创建你自定义的槽的信号并使他们连接起来,但是你不能直接实现你的槽,你不得不子集于该窗体,并在这个子集中对你自定义的槽编码,子集的方法依然有用,在某些情况下仍起作用(Make sense),但是现在你可以在Qt设计器中直接实现你的槽,在多的对话框和窗体的子集也不再需要了。(Qt设计器在.ui.h文件中存贮者槽的实现,具体的细节参看 走近设计器(The Designer Approach)中的.ui.h扩展方法)。

  多项剪辑应用程序需要四个槽,一个用于每个按钮,因为我们将一个信号连接到预定义的槽使得按下退出按钮时退出程序,所以仅有三个槽需要我们自定义,我们需要我增加剪辑按钮实现一个槽,其作用是将当前剪辑添加到列表框中,复制以前的按钮(Copy Previous)需要一个槽实现复制列表框中选中的项到线型编辑框中(也复制到剪贴板上),删除剪辑按钮(Delete Clipping)需要一个槽实现删除党旗那剪辑和列表框中的当前项,我们也需要写一些初始化的代码使得程序启动时,将当前剪贴板上的文本(如果有的话)复制到线型编辑框中,代码可以直接在Qt设计器中编写,声称的已写好的代码片断可以下面的文件中获取:qt/tools/designer/examples/multiclip/multiclip.ui.h

  我们需要一个Qt的全局剪贴板对象,在整个代码中有几个地方需要调用其含义是调用QApplication::clipboard()或者是qApp->clipboard(),比执行这些函数调用更好的方法,我们在窗体本身添加一个指向剪贴板的指针,点击对象浏览器中的源码标签(如果对象浏览器部可见,点击 Windows|Views|Object Explorer [由于Qt设计器没有汉化,再说汉化后似乎失去了其魅力,所以菜单的引用依然是English])源码标签显示了当前窗体中的函数、类变量、前部的声明和我们需要的一些包含文件的名字。

   鼠标右键点击类变量(Class Variable)项(可能在底部,你需要点击滑动条),然后再弹出的菜单中选择New子菜单,(如果存在变量,则弹出来的菜单中会有一个“Delete”删除的选项)键入QClipboard * cb 并按下Enter键确认输入,我们将创建一个init()函数,在这个函数中我们会赋予这个指针一个Qt的全局剪贴板对象的值。我们也需要声明剪贴板对象的头文件,右键点击包含(声明文件)[在Qt设计器中对应的为 Include(in Declaration)项],然后再弹出的菜单上选择 New ,键入“”,并按下Enter键确认输入,因为我们需要一个全局对象,qApp,我们就必须包含另一个声明文件,鼠标右键点击 包含(实现)项[在Qt设计器中对应为Include (in Implementation)],然后点击New 菜单项,键入“”并按下Enter键确认输入,这个变量和声明文件将被Qt设计器的.ui文件生成后包含(丛.ui文件生成的源文件.h 和.cpp文件会包含这个变量和声明文件)。

We will invoke Qt Designer's code editor and write the code.  现在我们将激活Qt设计器的代码编辑器并编写代码。

  首先我们创建一个init()函数,激活代码编辑器的一种途径是点击Source标签,然后点击你想编写代码的函数的名字,如果没有你需要的函数或者你想创建一个在Source标签中你可用的新函数,鼠标右键点击Source标签的槽(Slots)列表中的“protected”子项,然后点击New子菜单,出现一个“Edit Slots”编辑槽的对话框,改变槽的名字为Init(),然后点击OK,这样你可以点击编辑窗口中出现的函数名字并键入你的代码。

   注意到并不是强迫你使用Qt设计器的代码编辑器,在Qt设计器中你可以尽管的增加、删除或者重命名你的槽,你也可以用一个外部的编辑器编写的实现代码,Qt设计器会保存你所写的代码。下面是你需要实现的init()函数:

    void MulticlipForm::init()
    {
        lengthLCDNumber->setBackgroundColor( darkBlue );
        currentLineEdit->setFocus();

 

        cb = qApp->clipboard();
        connect( cb, SIGNAL( dataChanged() ), SLOT( dataChanged() ) );
        if ( cb->supportsSelection() )
            connect( cb, SIGNAL( selectionChanged() ), SLOT( selectionChanged() ) );

 

        dataChanged();
    }

函数体中开始的两行改变了数字指示器的背景颜色并使窗体的启动焦点在线型编辑框中,我们使用了一个指向Qt全局剪贴板的指针,并保存在我们定义的类变量 cb 中,我们连接剪贴板的dataChanged()信号到一个叫做 dataChanged()的槽,这个操我们马上就会创建,如果剪贴板支持选择(例如在X Windows系统中),我们也要连接剪贴板的selectionChanged()信号到一个我们将创建的具有相同名字的槽,最后我们将调用我们的dataChanged()槽函数,当程序启动时,将当前剪贴板中的文本内容(如果有的话)粘贴但线型编辑框中

 既然我们提到了dataChanged()和selectionChanged()槽,下面我们将对他们编码,从dataChanged()开始:

    void MulticlipForm::dataChanged()
    {
        QString text;
        text = cb->text();
        clippingChanged( text );
        if ( autoCheckBox->isChecked() )
            addClipping();
    }

  我们复制了剪贴板的文本并用我们获得文本调用我们自己定义的clippingChanged()槽,如果用户选中了自动增加剪辑检测框,我们将调用addClipping()槽增加该剪辑到列表框中。

 下面的代码只是在X Windows系统中可用,微软的Windows用户也能包含下面的代码确保该应用程序可以在多平台下运行。

    void MulticlipForm::selectionChanged()
    {
        cb->setSelectionMode( TRUE );
        dataChanged();
        cb->setSelectionMode( FALSE );
    }

 上面的代码中我们首先告诉剪贴板使用选择模式 ,我们调用dataChanged()槽获得任何选中的文本,然后设置剪贴板为默认模式。

In the another custom slot, clippingChanged().在另一个自定义的槽中,clippingChanged():

    void MulticlipForm::clippingChanged( const QString & clipping )
    {
        currentLineEdit->setText( clipping );
        lengthLCDNumber->display( (int)clipping.length() );
    }

  我们用任何传递给clippingChanged()槽的文本设置当前的线型编辑框,并用这个新文本的长度更新数字指示器。

   我们将要编码实现的下一个槽实现增加剪辑功能,当用户点击增加剪辑按钮时,这个槽被我们的代码内部调用(看上面的dataChanged()槽),即使我们让Qt设计器能够通过在编辑窗口键入代码来创建一个槽与信号的连接,我们也让Qt设计器为我们创建一个结构,(为我们生成程序框架),点击Edit|Slots 激活编辑槽(Edit Slots)对话框,点击New Slot按钮并把槽的缺省名字“new_slot()”改为“addClipping()”,这里不必改变访问标着和返回类型,现在我们已经创建了我们的槽,我们能在代码编辑器中出现的地方创建我们的槽并实现之。

增加剪辑按钮用于从当前剪辑线型编辑框中复制文本到列表框中,同时我们更新了文本长度数字指示器。

    void MulticlipForm::addClipping()
    {
        QString text = currentLineEdit->text();
        if ( ! text.isEmpty() ) {
            lengthLCDNumber->display( (int)text.length() );
            int i = 0;
            for ( ; i < (int)clippingsListBox->count(); i++ ) {
                if ( clippingsListBox->text( i ) == text ) {
                    i = -1; // Do not add duplicates
                    break;
                }
            }
            if ( i != -1 )
                clippingsListBox->insertItem( text, 0 );
        }
    }

  如果有新文本需要显示,同时改变数字指示器的值为当前文本的长度,然后我们在列表框中逐个比较文本项,看当前输入的文本是否存在列表框中,如果列表框中不存在该剪辑文本项,就在列表中插入该剪辑文本。

 为了使增加剪辑按钮工作,我们需要连接这个按钮的addClipping()槽,点击 Connect Signal/Slots 工具栏按钮,然后点击增加剪辑按钮,(将变成十字型的鼠标拖动到窗体上点击该按钮然后释放),(确认你拖向窗体而不是其他部件—拖动过程中窗体会有一个细红色边界,如果你操作错误你只需在槽组合框中改变其名字就可以了[这里我按原文翻译,可是有些地方和单词觉得上下文不对,如果你发现了正确的请与我联系])。连接编辑对话框将会显示,点击addClipping()槽,点击OK按钮确认该连接。

  复制前一个文本按钮(Copy Previous)用于从列表框中复制选中的文本项到线型编辑框中,同时该文本也放到了剪贴板上,剩下来的过程和增加剪辑按钮(Add Clipping)是一样的:首先我们创建一个槽,然后我们实现该槽,最后我们将按钮点击的信号和槽连接起来。

1.    创建槽:

 点击Edit|Slots菜单子项,激活槽编辑(Edit Slots)对话框,点击 New Slots 并将缺省的槽函数名字“new_slot()”改变为“copyPrevious()”,点击OK确认。

2.    实现槽函数

3.               void MulticlipForm::copyPrevious()
4.               {
5.                   if ( clippingsListBox->currentItem() != -1 ) {
6.                       cb->setText( clippingsListBox->currentText() );
7.                       if ( cb->supportsSelection() ) {
8.                           cb->setSelectionMode( TRUE );
9.                           cb->setText( clippingsListBox->currentText() );
10.                       cb->setSelectionMode( FALSE );
11.                   }
12.               }
13.           }

    这段复制上次剪辑的代码检测列表框中是否有选项选中,如果有选项被选中则该项会被复制到线型编辑框中,如果我们使用了一个支持选择的系统,我们将不得不重复复制,复制的次数和选择模式有关,我们不要显示的更新剪贴板,当线型编辑框的文本改变时,他发射了一个dataChanged()的信号,这个信号被我们创建的dataChanged()槽接收,我们的这个dataChanged()槽同时更新剪贴板。

14.连接到槽

 点击 Connect Signal/Slots 工具栏按钮,点击复制上次剪辑(Copy Previous)按钮,拖动到窗体然后释放鼠标,(光标变成十字型后,点击某个部件1,如按钮,拖动鼠标到另一个部件2或者窗体,则在出现的信号槽连接编辑对话框中,信号的发射者是部件1,接受信号的槽是部件2或者窗体的[试试就知道了J]),在弹出的连接编辑对话框中,点击clicked()信号和copyPrevious()槽,点击OK确认连接编辑。

  用同样的方法我们对删除剪辑(Delete Clipping)按钮进行信号和槽的连接编辑。

1.    点击Edit|Slots 菜单激活槽编辑对话框,点击 New Slot 按钮并替换缺省的槽名字为“deleteClipping()”,点击OK按钮。

2.    删除按钮必须删除列表框中的当前项并清除线型编辑框中的文本。

3.               void MulticlipForm::deleteClipping()
4.               {
5.                   clippingChanged( "" );
6.                   clippingsListBox->removeItem( clippingsListBox->currentItem() );
7.               }

我们以一个空字符串调用我们自己创建的clippingChanged()槽,使用列表框的removeItem()函数删除当前选项。

8.    连接删除剪辑(Delete Clipping )按钮的clicked()信号到我们创建的deleteClipping()槽,(按下F3键---这个点击Connnect Signals/Slots工具栏按钮效果一样,点击删除剪辑按钮并拖动鼠标到窗体上,释放鼠标,出现连接编辑对话框,点击clicked()信号和deleteClipping()槽,点击OK()确认连接编辑)

编译和生成应用程序

至此在Qt设计器中,我们写了一个Qt整个应用程序大约99%的代码,为了使应用程序编译和运行我们必须创建一个main.cpp文件,在这个文件中我们将显示调用我们的窗体。

  创建一个新的源文件的简单方法是点击File|New激活“New File”新文件对话框,适当的点击“C++ Source”或者“C++ Header”图标,然后点击“OK”按钮确认,一个新的空源文件显示出来,点击File|Save 激活另存为对话框(Save As ),键入“main.cpp”然后点击Save按钮保存该文件。

在main.cpp这个C++编辑窗口,键入以下代码。

    #include <qapplication.h>
    #include "multiclip.h"

 

    int main( int argc, char *argv[] )
    {
        QApplication app( argc, argv );

 

        MulticlipForm clippingForm;
        app.setMainWidget( &clippingForm );
        clippingForm.show();

 

        return app.exec();
    }

  这个程序创建了一个QApplication对象和我们的多项剪辑窗体的实例,并将该窗体设置为主部件并显示该窗体,app.exec()开始调用程序事件循环。

 现在启动控制台命令(命令行格式),并将当前目录切换到multiclip程序下,运行qmake命令,一个与你的系统兼容的Makefile文件将会生成。

qmake -o Makefile multiclip.pro

   现在你可以通过运行make或者nmake命令生成该应用程序。试着编译和运行Multiclip,你会取得许多的进步,使用布局工具和编写代码的试验可以帮助你学到关于Qt和Qt设计器的更多的东西。

  这一章向你介绍了使用Qt设计器创建一个跨平台的应用程序,我们创建了一个窗体并且用部件对其修饰,这些部件整齐优美的放置在窗体上并可以随着窗体缩放,我们已经使用了Qt的信号和槽的机制实现程序的功能,并生成了Makefile文件,这些增加部件到窗体并用布局工具对其放置,以及创建、编写和连接槽的技术,当你再次用Qt设计器创建程序是会用到,下面的章节会给出进一步的例子并介绍使用Qt设计器的更多技术。

翻译者 volrender

E-mail  volrender@163.com 


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt信号槽之创建和连接自定义的槽 的相关文章

  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • 如何将枚举类传递给 QML?

    我正在学习QML with Qt并在通过时遇到一些麻烦enum class to qml 当我使用信号时int参数 一切正常 代码运行完美 But 麻烦就在这里 如果我使用信号与一些enum class我有参数undefinedqml 信号
  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • 将 C++ 代码(本机客户端)移植到浏览器(Web 应用程序)

    我有一个使用 Qt creator SDK 编写的 C 模块 我想将此代码移植到任何网页上运行 而不会对最终用户损害源代码 用户应该能够在任何浏览器 Chrome Firefox Safari Explorer 上看到此模块的输出 而无需安
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • PyQt:使用 alpha 通道创建 QPixmap,而不是预乘颜色通道

    我想创建一个 QPixmap 来使用 QPainter 进行绘制 QPixmap 应支持透明度 而不使用预乘颜色通道 目前 我通过创建具有所需尺寸的 QPixmap 并用每个通道 包括 alpha 设置为零的 QColor 填充它来实现此目
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • QWebView等待加载

    bool MainWindow waitForLoad QWebView view QEventLoop loopLoad QTimer timer QObject connect view SIGNAL loadFinished bool
  • 如何使用样式表删除 QWizard 中的水平线?

    我正在研究一个样式表QWizard我想删除按钮上方的水平线 我已经发布了一个最小的例子here https stackoverflow com q 52538669 8570451 这个问题是由scopchanov从最小的例子中解决的 但是
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • 在 Qt 中构建 Android 项目不再有效

    所以我对 Android SDK NDK 和 Apache Ant 进行了一些更新 现在我无法构建任何 Android 项目 我收到一条警告 然后它说找不到 build xml 文件 错误 Warning Android platform

随机推荐

  • AI绘画:StableDiffusion实操教程-完美世界-魔女(附高清图下载)

    前段时间我分享了StableDiffusion的非常完整的教程 AI绘画 Stable Diffusion 终极宝典 从入门到精通 尽管如此 还有读者反馈说 尽管已经成功安装 但生成的图片与我展示的结果相去甚远 真实感和质感之间的差距到底在
  • C++中的类型推导

    本文参考Effective Morden C C 98只有一种类型推导规则 函数模板 而C 11改变了其中的一些规则 并添加了另外两种类型推导 他们是auto和decltype C 14又有了进一步的扩充 一 首先来看函数模板中的类型推导
  • Unity学习:资源存储加载之——文件夹、路径格式及其方法等

    1 Assets文件夹 Assets文件夹是unity项目中放置游戏资源的主文件夹 根目录文件夹 1 路径格式 assetsPath Assets xx xx xxx 2 编辑器下使用的加载方法 Resources LoadAssetAtP
  • 算法通关18关

    18关的前几篇文章看过之后 对回溯的模板问题基本解题思路就知道了 就是固定的for循环问题 外层for循环控制横向 递归控制纵向 还要考虑撤销操作和元素是否能被重复利用问题 重复利用的情景较少 只用注意撤销就行 1 复原IP地址 题目 经典
  • 01背包一维数组

    public class testWeightBagProblem1 public static void main String args Solution solution new testWeightBagProblem1 new S
  • Unity3D如何开发最简单的VR游戏 vrPlus(神之眼)

    VR是一种可创建和体验虚拟世界 Virtual World 的计算机系统 是一种可以创建和体验虚拟世界的计算机仿真系统 它利用计算机生成一种模拟环境 是一种多源信息融合的交互式三维动态视景和实体行为的系统仿真使用户沉浸到该环境中 作为一个u
  • Git(5)已有项目连接远端git仓库

    文章目录 初始化git 连接远程仓库 拉下仓库代码 添加代码到本地仓库 删除idea配置的git本地缓存 提交代码 推上去 初始化git git init 连接远程仓库 git remote add origin 你的仓库地址 拉下仓库代码
  • qqkey获取原理_【逆向】QQkey盗号木马原理分析

    一 简介 QQkey是一段字符串 通过这段字符串在没有QQ登录密码的前提下你依然能够在浏览器中对别人QQ空间 邮箱等应用进行随意访问和操作 现在市面上已经有很多使用易语言编写的盗号木马 专门盗取别人的QQkey 通过QQkey改绑关联了该邮
  • Robot Framework 自动化测试详解

    一 Robot Framework 简介 1 界面自动化测试工具 界面自动化测试 即UI自动化测试 比较常见的工具有 QTP AutoIt Selenium等 像QTP经历了很多版本 最新的版本好像叫UFT了 对初学者来说 录制回放是相当容
  • 搭建免费IP代理池

    声明 本文章中所有内容仅供学习交流 不可用于任何商业用途和非法用途 否则后果自负 如有侵权 请联系作者立即删除 由于本人水平有限 如有理解或者描述不准确的地方 还望各位大佬指教 搭建代理池思路 思路来源 崔庆才大佬的爬虫书 代理从何而来 用
  • 网络安全面试必问

    项目经历 因为大家写的都是渗透相关 所以编故事也要编的圆润些 题材可以去freebuf看 https search freebuf com search search E6 8C 96 E6 B4 9E article 这里主要记录如何挖洞
  • 三类保留地址(私有地址)【个人笔记,仅供参考】

    A类 10 X X X是私有地址 私有地址就是在互联网上不使用 而被用在局域网络中的地址 127 X X X是保留地址 用做循环测试用的 B类 172 16 0 0 172 31 255 255是私有地址 169 254 X X是保留地址
  • 在Anaconda下安装并使用Pytorch,pillow,numpy等库及Python版本的匹配

    我在Anaconda下创建的新环境为 python 3 7 0 pytorch 1 8 0 pillow 9 5 0 numpy 1 21 5 能够正常运行 如果我这个版本够用的话可以按照这个版本进行安装 具体步骤如下 1 在Anacond
  • PROFINET从站设备描述文件

    目录 一 GSDML文件名格式 二 设备标识信息 三 设备支持的通讯周期时间 四 设备支持的槽位和数据模块 相信熟悉工业现场的工程师们 对于PROFIBUS和PROFINET这两个工业协议都不陌生 过去在使用PROFIBUS现场总线时 从站
  • matlab 专家pid,专家PID

    3 专家控制器 专家控制器的模型是整个仿真模型中的重点 其实质就是把专家规则用Matlab现有计算元件实现出来 当前一般的做法就是利用 IF THEN 语句来表述一条一条的专家规则 28 把单回路控制中的部分规则做成的专家控制器如下所示 图
  • 什么是Elastic Stack

    什么是Elastic Stack Elastic Stack是由ELK演化而来 ELK是三种软件的简称 分别是Elasticsearch logstash kibana组成 在发展的过程中 又有新成员Beats的加入 形成了Elastic
  • Hadoop运行模式 之 本地运行模式

    Hadoop的运行模式包括 本地模式 伪分布式模式以及完全分布式模式 Hadoop官网地址 https hadoop apache org 本次使用的Hadoop的版本是2 7 2 官网文档 https hadoop apache org
  • ssh-keygen 常用命令与参数

    ssh keygen 常用命令与参数 生成密钥 默认生成 2048 位 RSA 密钥 ssh keygen 生成 4096 位 RSA 密钥 ssh keygen t rsa b 4096 生成 521 位 ECDSA 密钥 ssh key
  • sql注入基础原理(超详细)

    一 Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中 再在后台 Sql 服务器上解析执行进行的攻击 它目前黑客对数据库进行攻击的最常用手段之一 二 Web 程序三层架构 三层架构 3 tier a
  • qt信号槽之创建和连接自定义的槽

    在第一版的Qt设计器中 你可以创建你自定义的槽的信号并使他们连接起来 但是你不能直接实现你的槽 你不得不子集于该窗体 并在这个子集中对你自定义的槽编码 子集的方法依然有用 在某些情况下仍起作用 Make sense 但是现在你可以在Qt设计