Qt对话框设计

一、标准对话框

《Qt 5.9 C++开发指南》中6.1章即为标准对话框的开发,主界面如下:

1.QFileDialog对话框

(1)打开一个文件

若要打开一个文件,可调用静态函数QFileDialog:getOpenFileName(),"打开一个文件"按钮

的响应代码如下:

cpp 复制代码
void Dialog::on_btnOpen_clicked()
{ //选择单个文件
    QString curPath=QDir::currentPath();//获取系统当前目录
//  QString  curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
    QString dlgTitle="选择一个文件"; //对话框标题
    QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器

    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);

    if (!aFileName.isEmpty())
        ui->plainTextEdit->appendPlainText(aFileName);
}

点击后,弹出选择界面:

(2)打开多个文件

若要选择打开多个文件,可使用静态函数QFileDialog::getOpenFileNames(),"打开多个文件"按钮的响应代码如下:

cpp 复制代码
void Dialog::on_btnOpenMulti_clicked()
{ //选择多个文件
//  QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
    QString curPath=QDir::currentPath();//获取系统当前目录
    QString dlgTitle="选择多个文件"; //对话框标题
    QString filter="文本文件(*.txt);;图片文件(*.jpg *.gif *.png);;所有文件(*.*)"; //文件过滤器

    QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
    for (int i=0; i<fileList.count();i++)
        ui->plainTextEdit->appendPlainText(fileList.at(i));
}

点击后弹出的页面与打开一个文件的相同,只不过可以选择多个文件。

(3)选择已有目录

选择已有目录(选择一个文件夹)可调用静态函数QFileDialog:getExistingDirectory(),同样,若需要传递对话框标题和初始路径,还应传递一个选项,一般用QFileDialog:ShowDirsOnly,表示对话框中只显示

目录。

cpp 复制代码
void Dialog::on_btnSelDir_clicked()
{ //选择文件夹
    QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//  QString curPath=QDir::currentPath();//获取系统当前目录
//调用打开文件对话框打开一个文件

    QString dlgTitle="选择一个目录"; //对话框标题
    QString selectedDir=QFileDialog::getExistingDirectory(this,dlgTitle,curPath,QFileDialog::ShowDirsOnly);
    if (!selectedDir.isEmpty())
        ui->plainTextEdit->appendPlainText(selectedDir);
}

点击后弹出的页面如下:

(4)选择保存文件名

选择一个保存文件,使用静态函数QFileDialog:getSaveFileName(),传递的参数与getOpenFileName()函数相同。只是在调用getSaveFileName()函数时,若选择的是一个已经存在的文件,会提示是否覆盖原有的文件。如果提示覆盖,会返回为选择的文件,但是并不会对文件进行实质操作,对文件的删除操作需要在选择文件之后自己编码实现。如下面的代码,即使选择覆盖文件,由于代码里没有实质地覆盖原来的文件,也不会对选择的文件造成任何影响。

cpp 复制代码
void Dialog::on_btnSave_clicked()
{//保存文件
    QString curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
    QString dlgTitle="保存文件"; //对话框标题
    QString filter="文本文件(*.txt);;h文件(*.h);;C++文件(.cpp);;所有文件(*.*)"; //文件过滤器
    QString aFileName=QFileDialog::getSaveFileName(this,dlgTitle,curPath,filter);
    if (!aFileName.isEmpty())
        ui->plainTextEdit->appendPlainText(aFileName);
}

点击后弹出的页面如下:

2.QColorDialog对话框

QColorDialog是选择颜色对话框,选择颜色使用静态函数QColorDialog::getColor()。下面是

"选择颜色"按钮的代码,它为文本框的字体选择颜色。

cpp 复制代码
void Dialog::on_btnColor_clicked()
{
    QPalette pal=ui->plainTextEdit->palette(); //获取现有 palette
    QColor  iniColor=pal.color(QPalette::Text); //现有的文字颜色
    QColor color=QColorDialog::getColor(iniColor,this,"选择颜色");
    if (color.isValid()) //选择有效
    {
        pal.setColor(QPalette::Text,color); //palette 设置选择的颜色
        ui->plainTextEdit->setPalette(pal); //设置 palette
    }
}

getColor()函数需要传递一个初始的颜色,这里是将palette提取的文本颜色作为初始颜色。

getColor()函数返回一个颜色变量,若在颜色对话框里取消选择,则返回的颜色值无效,通过

QColor::isValid()函数来判断返回是否有效。

点击后弹出的页面如下:

3.QFontDialog对话框

QFontDialog是选择字体对话框,选择字体使用静态函数QFontDialog:getFontO。下面是"选择字体"按钮的代码,它为文本框选择字体,字体设置的内容包括字体名称、大小、粗体、斜体等。

gctFont()返回一个字体变量,但是QFont没有类似于isValid()的函数来判断有效性,所以在调用getFont()函数时以引用方式传递一个逻辑变量ok,调用后通过判断ok是否为true来判断字体选择是否有效。

cpp 复制代码
void Dialog::on_btnFont_clicked()
{//选择字体
    QFont iniFont=ui->plainTextEdit->font(); //获取文本框的字体
    bool   ok=false;
    QFont font=QFontDialog::getFont(&ok,iniFont); //选择字体
    if (ok) //选择有效
        ui->plainTextEdit->setFont(font);
}

4.QInputDialog标准输入对话框

QInputDialog有单行字符串输入、整数输入、浮点数输入、列表框选择输入和多行文本等多

种输入方式。

(1)输入文字

QInputDialog:getText()函数显示一个对话框用于输入字符串,传递的参数包括对话框标题、

提示标签文字、缺省输入、编辑框响应模式等。

其中编辑框响应模式是枚举类型QLineEdit:EchoMode,它控制编辑框上文字的显示方式,正

常情况下选择QLineEdit::Normal;如果是输入密码,选择QLineEdit:Password。

枚举值 说明 适用场景
QLineEdit::Normal 正常显示:输入什么就显示什么(默认模式)。 普通文本输入(如用户名、邮箱)
QLineEdit::NoEcho 完全隐藏:输入的字符不显示任何反馈。 极端敏感输入(极少用,易导致输入错误)
QLineEdit::Password 密码模式:输入的字符被替换为掩码字符 (默认是 *)。 常规密码输入(如登录密码)
PasswordEchoOnEdit 编辑时显示真实字符,失去焦点后切换为密码模式(输入时可见,离开后隐藏)。 提升密码输入体验(现代应用常用)

代码如下:

cpp 复制代码
void Dialog::on_btnInputString_clicked()
{ //输入字符串
    QString dlgTitle="输入文字对话框";
    QString txtLabel="请输入文件名";
    QString defaultInput="新建文件.txt";
    QLineEdit::EchoMode echoMode=QLineEdit::Normal;//正常文字输入
//    QLineEdit::EchoMode echoMode=QLineEdit::Password;//密码输入

    bool ok=false;
    QString text = QInputDialog::getText(this, dlgTitle,txtLabel, echoMode,defaultInput, &ok);
    if (ok && !text.isEmpty())
        ui->plainTextEdit->appendPlainText(text);
}

点击按钮后,弹出的页面如下:

(2)输入整数

使用QInputDialog:getIntO函数输入一个整数,下面的代码为文本选择字体大小。输入整数对话框使用一个SpinBox组件输入整数,getInt()需要传递的参数包括数值大小范围、步长、初始值,确认选择输入后,将输入的整数值作为文本框字体的大小。

cpp 复制代码
void Dialog::on_btnInputInt_clicked()
{//输入整数
    QString dlgTitle="输入整数对话框";
    QString txtLabel="设置字体大小";
    int defaultValue=ui->plainTextEdit->font().pointSize(); //现有字体大小
    int minValue=6, maxValue=50,stepValue=1; //范围,步长
    bool ok=false;
    int inputValue = QInputDialog::getInt(this, dlgTitle,txtLabel,
                               defaultValue, minValue,maxValue,stepValue,&ok);
    if (ok) //是否确认输入
    {
        QFont   font=ui->plainTextEdit->font();
        font.setPointSize(inputValue);
        ui->plainTextEdit->setFont(font);
    }
}

点击按钮后,弹出的页面如下:

(3)输入浮点数

使用QInputDialog:getDouble()函数输入一个浮点数,输入对话框使用一个QDoubleSpinBox

作为输入组件,getDouble()的输入参数需要输入范围、初始值、小数点位数等。代码如下:

cpp 复制代码
void Dialog::on_btnInputFloat_clicked()
{ //输入浮点数
    QString dlgTitle="输入浮点数对话框";
    QString txtLabel="输入一个浮点数";
    float defaultValue=3.13;

    float minValue=0, maxValue=10000;  //范围
    int decimals=2;//小数点位数

    bool ok=false;
    float inputValue = QInputDialog::getDouble(this, dlgTitle,txtLabel,
                            defaultValue, minValue,maxValue,decimals,&ok);
    if (ok) //确认选择
    {
        QString str=QString::asprintf("输入了一个浮点数:%.2f",inputValue);
        ui->plainTextEdit->appendPlainText(str);
    }
}

点击按钮后弹出的页面如下:

(4)下拉列表选择输入

使用QInputDialog:getItem()可以从一个ComboBox组件的下拉列表中选择输入。getItem()函数需要一个QStringList变量为其ComboBox组件做条目初始化,curIndex指明初始选择项,editable表示对话框里的ComboBox是否可编辑,若不能编辑,则只能在下拉列表中选择。

cpp 复制代码
void Dialog::on_btnInputItem_clicked()
{ //条目选择输入
    QStringList items; //ComboBox 列表的内容
    items <<"优秀"<<"良好"<<"合格"<<"不合格";

    QString dlgTitle="条目选择对话框";
    QString txtLabel="请选择级别";
    int     curIndex=0; //初始选择项
    bool    editable=true; //ComboBox是否可编辑
    bool    ok=false;
    QString text = QInputDialog::getItem(this, dlgTitle,txtLabel,items,curIndex,editable,&ok);

    if (ok && !text.isEmpty())
        ui->plainTextEdit->appendPlainText(text);
}

点击后弹出的页面如下:

5.QMessageBox消息对话框

(1)简单消息提示

消息对话框QMessageBox用于显示提示、警告、错误等信息,或进行确认选择,由几个静态

函数实现这些功能。其中warning()、information()、critical()和 about()这几个函数的输入参数和使用方法相同,只是信息提示的图标有区别。例如,warning()的函数原型是:

cpp 复制代码
StandardButton QMessageBox::warning(Qwidget *parent,const Qstring &title,const
QString &text, StandardButtons buttons = Ok, StandardButton defaultButton = NoButton)

其中,parent是对话框的父窗口,指定父窗口之后,打开对话框时,对话框将自动显示在父窗

口的上方中间位置;title是对话框标题字符串;text是对话框需要显示的信息字符串;buttons是对话框提供的按钮,缺省只有一个OK按钮;defaultButton是缺省选择的按钮,缺省表示没有选择。

warning()函数的返回结果是StandardButton类型。对话框上显示的按钮和缺省选中按钮也是

StandardButton类型。

StandardButton是各种按钮的定义,如OK、Yes、No、Cancel等,其枚举取值是QMessageBox::Ok、QMessageBox::Cancel、QMessageBox::Close等,详见Qt帮助文档中的 StandardButton类型的说明。

对于warning()、information()、critical()和 about()这几种对话框,它们一般只有一个OK按钮,且无须关心对话框的返回值。所以,使用缺省的按钮设置即可。下面是程序中点击按钮弹出的对话框。

cpp 复制代码
void Dialog::on_btnMsgInformation_clicked()
{
    QString dlgTitle="information消息框";
    QString strInfo="文件已经打开,字体大小已设置";

//    QMessageBox::information(this, dlgTitle, strInfo);//使用缺省的按钮
   QMessageBox::information(this, dlgTitle, strInfo,
                              QMessageBox::Ok,QMessageBox::NoButton);
}

void Dialog::on_btnMsgWarning_clicked()
{
    QString dlgTitle="warning 消息框";
    QString strInfo="文件内容已经被修改";

    QMessageBox::warning(this, dlgTitle, strInfo);
}

void Dialog::on_btnMsgCritical_clicked()
{
    QString dlgTitle="critical消息框";
    QString strInfo="有不明程序访问网络";
    QMessageBox::critical(this, dlgTitle, strInfo);
}

void Dialog::on_btnMsgAbout_clicked()
{
    QString dlgTitle="about消息框";
    QString strInfo="我开发的数据查看软件 V1.0 \n 保留所有版权";

    QMessageBox::about(this, dlgTitle, strInfo);
}

(2)确认选择对话框

QMessageBox::question()函数用于打开一个选择对话框,提示信息,并提供Yes、No、OK、Cancel等按钮,用户单击某个按钮返回选择示。

静态函数QMessageBox::question()的原型如下:

cpp 复制代码
StandardButton QMessageBox::question (Qwidget *parent, const QString &title, const
QString &text, StandardButtons buttons = StandardButtons( Yes | No ),StandardButton
defaultButton=NoButton)

question()对话框的关键是在其中可以选择显示多个按钮,例如同时显示Yes、No、OK或

Cancel。其返回结果也是一个StandardButton类型变量,表示哪个按钮被单击了。

cpp 复制代码
void Dialog::on_btnMsgQuestion_clicked()
{
    QString dlgTitle="Question消息框";
    QString strInfo="文件已被修改,是否保存修改?";

    QMessageBox::StandardButton  defaultBtn=QMessageBox::NoButton; //缺省按钮

    QMessageBox::StandardButton result;//返回选择的按钮
    result=QMessageBox::question(this, dlgTitle, strInfo,
                      QMessageBox::Yes|QMessageBox::No |QMessageBox::Cancel,
                      defaultBtn);

    if (result==QMessageBox::Yes)
        ui->plainTextEdit->appendPlainText("Question消息框: Yes 被选择");
    else if(result==QMessageBox::No)
        ui->plainTextEdit->appendPlainText("Question消息框: No 被选择");
    else if(result==QMessageBox::Cancel)
        ui->plainTextEdit->appendPlainText("Question消息框: Cancel 被选择");
    else
        ui->plainTextEdit->appendPlainText("Question消息框: 无选择");
}

二、自定义对话框

在一个应用程序设计中,为了实现一些特定的功能,必须设计自定义对话框。自定义对话框的设计一般从QDialog继承,并且可以采用UI设计器可视化地设计对话框。对话框的调用一般包

括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获

取对话框输入数据等过程。

1.对话框的模态

在 Qt 中,"对话框的模态"(Modality)指的是对话框打开时,是否允许用户操作其他窗口。

Qt对话框的模态通过Qt::WindowModality枚举定义,主要分为两类:

1.应用程序级模态(Qt::ApplicationModa1)

特点:对话框打开后,整个应用程序的所有窗口都被阻塞,用户必须关闭该对话框后,才能操作应用程序的其他部分。

适用场景:需要用户必须处理的关键操作(如"确认删除"保存文件"),防止用户忽略重要提示。

  1. 窗口级模态(Qt:WindowModal)

特点:对话框打开后,只有其父窗口(或关联的窗口)被阻塞,其他无关窗口仍可正常操作。

适用场景:与某个窗口强相关的交互(如"设置当前页面参数"),不影响其他窗口的使用。

Qt 中所有对话框(QDialog 及其子类,如 QMessageBoxQFileDialog)都可通过以下方式设置模态。

(1)通过 exec() 显示模态对话框(最常用)

exec()QDialog 的成员函数,调用后对话框会以 应用程序级模态 显示,且会阻塞当前代码,直到对话框关闭后才返回(返回值为 QDialog::AcceptedQDialog::Rejected,表示用户操作结果)。

cpp 复制代码
#include <QDialog>
#include <QPushButton>

// 示例:点击按钮弹出模态对话框
void Widget::on_btnOpenModal_clicked() {
    QDialog *dialog = new QDialog(this); // this 为父窗口
    dialog->setWindowTitle("应用程序级模态对话框");
    dialog->resize(200, 100);

    // 添加一个确认按钮
    QPushButton *btnOK = new QPushButton("确认", dialog);
    btnOK->move(50, 50);
    connect(btnOK, &QPushButton::clicked, dialog, &QDialog::accept);

    // 用 exec() 显示,应用程序级模态
    int result = dialog->exec(); 
    if (result == QDialog::Accepted) {
        qDebug() << "用户点击了确认";
    }

    delete dialog; // 手动释放(或设置父对象自动释放)
}
(2)通过 setModal(true) + show() 显示模态对话框

setModal(true) 可将对话框设置为 应用程序级模态 (默认),若要设置为窗口级模态,需用 setWindowModality(Qt::WindowModal)

exec() 不同,show() 不会阻塞代码,调用后立即返回,适合需要异步处理的场景。

cpp 复制代码
void Widget::on_btnOpenWindowModal_clicked() {
    QDialog *dialog = new QDialog(this);
    dialog->setWindowTitle("窗口级模态对话框");
    dialog->resize(200, 100);

    // 设置为窗口级模态(仅阻塞父窗口)
    dialog->setWindowModality(Qt::WindowModal); 

    // 用 show() 显示(非阻塞)
    dialog->show(); 

    // 为避免内存泄漏,设置关闭时自动删除
    dialog->setAttribute(Qt::WA_DeleteOnClose); 
}
(3)非模态对话框(无阻塞)

若不需要模态(允许用户同时操作其他窗口),直接用 show() 显示即可(默认非模态)

cpp 复制代码
void Widget::on_btnOpenNonModal_clicked() {
    QDialog *dialog = new QDialog(this);
    dialog->setWindowTitle("非模态对话框");
    dialog->resize(200, 100);

    // 直接 show(),默认非模态(不阻塞任何窗口)
    dialog->show(); 

    // 关闭时自动删除
    dialog->setAttribute(Qt::WA_DeleteOnClose); 
}

非模态对话框用 show() 显示时,需通过 setAttribute(Qt::WA_DeleteOnClose) 设置关闭时自动释放,避免内存泄漏(模态对话框用 exec() 显示后可手动删除)。对话框尽量指定父窗口(如 new QDialog(this)),确保对话框随父窗口移动、关闭,且模态时能正确阻塞父窗口。

2.对话框的槽函数

仅适用于 QDialog 及其子类accept()与reject()QDialog 的成员函数,普通窗口没有这两个槽;

accept():返回 QDialog::Accepted(1),表示用户确认;

reject():返回 QDialog::Rejected(0),表示用户取消。

在 Qt 中,accept()QDialog 类的一个槽函数 ,用于处理对话框的 "确认" 操作(比如用户点击 "确定" 按钮)。调用 accept() 后,对话框会关闭,并向调用者返回 "确认" 状态(QDialog::Accepted),方便主窗口根据用户操作做后续处理。

accept()的核心作用

1.关闭对话框:调用后,对话框会立即隐藏并关闭;

2.返回确认状态:若对话框通过exec()显示(模态对话框),exec()会返回QDialog::Accepted(值为1),主窗口可通过该返回值判断用户是否确认操作;

3.触发信号:会间接触发finished(int result)信号(result为QDialog::Accepted),可通过该信号做额外处理。

通常将对话框中的 "确认" 按钮(如 QPushButton)的 clicked 信号与 accept() 槽连接,实现 "点击按钮→确认→关闭对话框" 的逻辑。

例子

《Qt 5.9 C++开发指南》中6.2章中有多个自定义对话框的例子,其中有一个自定义对话框的类定义如下:

cpp 复制代码
#ifndef QWDIALOGSIZE_H
#define QWDIALOGSIZE_H

#include <QDialog>

namespace Ui {
class QWDialogSize;
}

class QWDialogSize : public QDialog
{
    Q_OBJECT

public:
    explicit QWDialogSize(QWidget *parent = 0);
    ~QWDialogSize();

    int     rowCount();//获取对话框输入的行数
    int     columnCount();//获取对话框输入的列数
    void    setRowColumn(int row, int column); //初始对话框上两个SpinBox的值

private slots:

private:
    Ui::QWDialogSize *ui;
};

#endif // QWDIALOGSIZE_H

类的实现如下:

cpp 复制代码
#include "qwdialogsize.h"
#include "ui_qwdialogsize.h"

#include    <QMessageBox>

QWDialogSize::QWDialogSize(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QWDialogSize)
{
    ui->setupUi(this);
}

QWDialogSize::~QWDialogSize()
{
    QMessageBox::information(this,"提示","设置表格行列数对话框被删除");
    delete ui;
}

int QWDialogSize::rowCount()
{ //用于主窗口调用获得行数的输入值
    return  ui->spinBoxRow->value();
}

int QWDialogSize::columnCount()
{//用于主窗口调用获得列数的输入值
    return  ui->spinBoxColumn->value();
}

void QWDialogSize::setRowColumn(int row, int column)
{ //初始化数据显示
    ui->spinBoxRow->setValue(row);
    ui->spinBoxColumn->setValue(column);
}

在主窗口中点击相应按钮后,相应代码如下,用于创建、显示对话框,并读取对话框上设置的行数、列数。

cpp 复制代码
void MainWindow::on_actTab_SetSize_triggered()
{ //模态对话框,动态创建,用过后删除
    QWDialogSize    *dlgTableSize=new QWDialogSize(this); //创建对话框
//   dlgTableSize->setAttribute(Qt::WA_DeleteOnClose);
//对话框关闭时自动删除对话框对象,用于不需要读取返回值的对话框
//如果需要获取对话框的返回值,不能设置该属性,可以在调用完对话框后删除对话框
    Qt::WindowFlags    flags=dlgTableSize->windowFlags();
    dlgTableSize->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小

    dlgTableSize->setRowColumn(theModel->rowCount(),theModel->columnCount()); //对话框数据初始化

    int ret=dlgTableSize->exec();// 以模态方式显示对话框,用户关闭对话框时返回 DialogCode值
    if (ret==QDialog::Accepted) //OK键被按下,对话框关闭,若设置了setAttribute(Qt::WA_DeleteOnClose),对话框被释放,无法获得返回值
    { //OK键被按下,获取对话框上的输入,设置行数和列数
        int cols=dlgTableSize->columnCount();
        theModel->setColumnCount(cols);

        int rows=dlgTableSize->rowCount();
        theModel->setRowCount(rows);
    }
    delete dlgTableSize; //删除对话框
}

点击按钮后弹出的对话框如下

对话框中的"确定"与"取消"按钮的clicked()信号分别连接至对话框的accept()槽函数与reject()槽函数。

从代码中可以看到,每次单击此工具栏按钮时,对话框都被重新创建。创建后用QDialog的

setWindowFlags()函数将对话框设置为固定大小,然后调用对话框的自定义函数setRowColumn(),将主窗口数据模型theModel的现有的行数和列数显示到对话框上的两个SpinBox组件里。

调用对话框的exec()函数,以模态显示的方式显示对话框。模态显示方式下,用户只能在对

话框上操作,不能操作主窗口,主程序也在此处等待exec()函数的返回结果。

当用户单击"确定"按钮关闭对话框后,exec()返回结果为QDialog:Accepted,主程序获得此

返回结果后,通过对话框的自定义函数columnCountO和rowCountO获得对话框上新输入的列数和

行数,然后设置为数据模型的列数和行数。

最后使用delete删除创建的对话框对象,释放内存。所以,关闭对话框时,会出现QWDialogSize析构函数里的消息提示对话框。

相关推荐
QT 小鲜肉11 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
MeowKnight95811 小时前
【Qt】Qt实践记录3——UDP通信
笔记·qt
扶尔魔ocy16 小时前
【QT自定义2D控件】QGraphics绘制仪表盘
数据库·qt·microsoft
开心-开心急了17 小时前
关于Flutter与Qt for python 的一些技术、开源、商用等问题
开发语言·python·qt·flutter
友友马17 小时前
『 QT 』按钮类控件属性解析
开发语言·数据库·qt
QT 小鲜肉18 小时前
【Git、GitHub、Gitee】按功能分类汇总Git常用命令详解(超详细)
c语言·网络·c++·git·qt·gitee·github
老歌老听老掉牙1 天前
解决 PyQt5 中 sipPyTypeDict() 弃用警告的完整指南
python·qt
共享家95272 天前
Qt窗口教程(上)
开发语言·qt
俊俊谢2 天前
OpenCV环境配置(QT 6.6.1 MSVC2019 64bit + OpenCV – 4.12.0)
qt·opencv·msvc