C1-QT的信号与槽


基于QT6.9版本,QT Creator 17.0.0(社区版),Win11OS

课程来自B站QT速成课,此为本人的个人笔记。

信号与槽是QT的重要机制。当我们需要一个界面通知另一个界面时常采用信号与槽。通过链接信号和槽,当一个界面发送信号时,链接该信号的槽会被响应,从而达到消息传递的目的。

本小节会制作一个小型的仿cmd程序,编辑界面文件如下:在这里插入图片描述

首先创建一个QT Widgets Application,Base Class选择QMainWinodw或者QWidget都行。本小节选择继承QMainWInodw。接着按照示例绘制ui…

题外话,如果想要所有窗口设置为浅色模式,可以在main.cpp内实现:

#include "mainwindow.h"
#include <QApplication>
#include <QStyleFactory>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // 强制使用浅色样式(如Fusion样式)
    a.setStyle(QStyleFactory::create("Fusion"));
    
    // 设置浅色调色板
    QPalette lightPalette;
    lightPalette.setColor(QPalette::Window, QColor(240, 240, 240));
    lightPalette.setColor(QPalette::WindowText, Qt::black);
    lightPalette.setColor(QPalette::Base, Qt::white);
    lightPalette.setColor(QPalette::AlternateBase, QColor(233, 231, 227));
    lightPalette.setColor(QPalette::ToolTipBase, Qt::white);
    lightPalette.setColor(QPalette::ToolTipText, Qt::black);
    lightPalette.setColor(QPalette::Text, Qt::black);
    lightPalette.setColor(QPalette::Button, QColor(240, 240, 240));
    lightPalette.setColor(QPalette::ButtonText, Qt::black);
    lightPalette.setColor(QPalette::BrightText, Qt::red);
    lightPalette.setColor(QPalette::Link, QColor(42, 130, 218));
    lightPalette.setColor(QPalette::Highlight, QColor(61, 174, 233));
    lightPalette.setColor(QPalette::HighlightedText, Qt::white);
    
    a.setPalette(lightPalette);
    
    MainWindow w;
    w.show();
    return a.exec();
}

接下来介绍几种常见的信号与槽实现:

  1. 在ui界面的按钮处点击右键后选择转到槽,至于选clicked()还是别的啥看情况。
    点击完后QT会在mainwindow.h与mainwindow.cpp中自动添加声明与定义。
    默认槽函数的名称为on_按钮名称_选择的信号。比如本小节的按钮选择的信号都是clicked(),Confirm按钮改名为ConfirmBtn,则对应的槽函数为on_ConfirmBtn_clicked()
    想要实现的逻辑在.cpp内的槽函数内写即可:
void MainWindow::on_ConfirmBtn_clicked()
{
    //获取lineEdit数据
    QString program=ui->cmdLineEdit->text();
    //创建process对象并启用进程
    QProcess*myprocess=new QProcess(this);
    myprocess->start(program);
}

运行时输入notepad可以打开记事本,别的没试过。

2.使用connect函数,参数有五个,Qt手册里是这么写的:
(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)
即信号发出方,发出信号种类,信号接收方,处理方法,连接方式(默认为自动连接)。
实现敲回车也可以触发打开事件,在MainWindow构造函数内使用connect函数:

//由cmdLineEdit发出按下回车信号,this(即主窗口)接收,处理方法即上文的槽函数
qt4的写法(不推荐):
//qt4 风格的Slot和Signal 只是宏转换,字符串定义不能检测编译错误
connect(ui->cmdLineEdit,SIGNAL(returnPressed),this,SLOT(on_ConfirmBtn_clicked));
//qt5及以上的写法:
connect(ui->cmdLineEdit,&QLineEdit::returnPressed,this,&MainWindow::on_ConfirmBtn_clicked);

取消功能的实现很简单:

void MainWindow::on_CancelBtn_clicked()
{
    this->close();
}

同样在MainWindow构造函数内实现connect

connect(ui->CancelBtn,&QPushButton::clicked,this,&MainWindow::on_CancelBtn_clicked);

而想要实现的功能不是那么复杂的话,也可以使用lambda表达式,这样就不用多定义一个槽函数了:

   //记得在头文件内添加#include<QMessageBox>
   connect(ui->BrowseBtn,&QPushButton::clicked,[this]()
   {
       //点击Browse按钮后弹出一个对话框
       QMessageBox::information(this,"info","click to browse");
   });
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐