qt 问题和方法集

Qt 专栏收录该内容
12 篇文章 0 订阅


文章目录

  1. 标题图片QLabel加入QWidget,初始化界面的QWidget,图片不可见了。其他控件也是大小加入QWidget之后QSize代码初始化设置随着QWidget设置大小,但是也是不正确的大小。是需要QWidget show出来之后才可以确定大小

使用代码add 的widget会直接显示为QSize(0,0),所以图片不可以见。
先建立一个widget 然后对这个窗体设置属性。即可。
不能直接对addWidget 的widget进行设置,在widget自定义设置也是不可以。
解决方式:
• 可以对标题外层的QWidget设置属性
• 在窗体show出来之后,重新定义大小
bool CMessageBox_Dlg::event(QEvent *event)
{
if(event->type() == QEvent::Show)
{
doSomething();
}
return QDialog::event(event);
}

  1. 窗体、QWidget设置固定大小

1、 一种方法是设置它的最大窗口值和最小窗口值,并且使最大值和最小值相等。
简单的示例: setMinimumSize(370, 150); setMaximumSize(370, 150);
此时窗口大小便被固定为(370,150)。
2、一种方法是使用setFixedSize(),这样一句话就可以解决问题。
简单的示例: setFixedSize(365,240);
窗口的最大化按钮将变得不可用。

窗体的变化引起的变化

会自动调用触发:void resizeEvent(QResizeEvent *event);
当调用repaint() -->会自动触发回调函数:void paintEvent(QPaintEvent *event);//重绘窗体

在窗体中放置一张图片,并且可以自适应

可以放置一张label,让label自适应Widget的大小,
ui->l_pic->setScaledContents(true);
ui->l_pic->resize(size());

图片截取一部分显示。

QPixmap QPixmap::copy ( const QRect & rectangle = QRect() ) const
QPixmap QPixmap::copy ( int x, int y, int width, int height ) const
用这两个函数,就可以截取一部分图片。
应该用一个QPixmap 去接收对应的copy返回值

图片拉伸过程中,图片闪烁。

不要对图片的窗体使用布局管理器。

图片旋转

tansformed之后的需要接收它的返回值。
水平翻转
void ImageViewer::horFilp()
{
image = image.mirrored(true, false);
imageLabel->setPixmap(QPixmap::fromImage(image));
}
垂直翻转
void ImageViewer::verFilp()
{
image = image.mirrored(false, true);
imageLabel->setPixmap(QPixmap::fromImage(image));
}
顺时针旋转
void ImageViewer::clockwise()
{
QMatrix matrix;
matrix.rotate(90.0);
image = image.transformed(matrix,Qt::FastTransformation);
imageLabel->setPixmap(QPixmap::fromImage(image));
}
逆时针旋转
void ImageViewer::anticlockwise()
{
QMatrix matrix;
matrix.rotate(-90.0);
image = image.transformed(matrix,Qt::FastTransformation);
imageLabel->setPixmap(QPixmap::fromImage(image));
}

画图时候:QWidget::paintEngine: Should no longer be called

将QPainter painter(this);

画图,在控件上画图,不能绘制。需要注册事件

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->label && event->type() == QEvent::Paint)
{
magicTime();
}
return QWidget::eventFilter(watched,event);
}

void Widget::magicTime()
{
QPainter painter(ui->label);
painter.setPen(Qt::gray);
painter.setBrush(Qt::green);
painter.drawRect(10,10,200,200);
}

ui->label->installEventFilter(this);

label上有图片,然后再绘图。不能绘制的问题

自定义label,然后重写paintEvent() 函数。然后再mouseReleaseEvent() 来调用update();

tableWidget 定位到某一行,并且高亮

有两个方式:
tableWidget->verticalScrollBar()->setSliderPosition(row);//不能高亮,可以定位到行
ui->tableWidget->selectRow(row);//存在很多的selectXXX 的方法。

鼠标选中某行触发事件。

通过行号获取某项的内容

QString str = ui->TableWidget->item(row,column)->text();//取出字符串
int num = str.toInt();//转成int
ui->TableWidget->item(row,column)->setText(QString("%1").arg(num));//写入

ps:row(行)和column(列)都是从0 开始,注意不要越界。

Qt限制文本框仅输入数字,正则表达式

lineEdit_3->setValidator(new QRegExpValidator(QRegExp("[0-9]+$"))); //只能输入数字
lineEdit->setValidator(new QDoubleValidator(-180.0,180.0,6,this)); //存在最大值,也可以使用正则表达式来设置
lineEdit->setValidator(new QIntValidator(0, 1000, this)); //int类型

widget中的控件获得焦点:setFocus();

输入完数据之后,直接enter 的事件快速实现:

connect(lineEdit_PW, SIGNAL(returnPressed()), pushButton_login, SIGNAL(clicked()), Qt::UniqueConnection);

回车 Enter可以通过事件去捕获然后实现功能。KeypressEvent();

QLable内容显示自动换行:setWordWrap(true);

pushbutton实现长按的功能

原生的按钮没有长按的功能,但是可以通过pressed + click + QTimer来实现

QTableWidget的操作

列操作中是获取horizontalHeader(); 而行操作是获取verticalHeader();
控件居中需要添加widget,然后添加布局进去
QWidget *widget = new QWidget;
QHBoxLayout *hLayout;
hLayout = new QHBoxLayout();
hLayout->addWidget( label);
hLayout->addWidget(comBox);
hLayout->setMargin(0);
hLayout->setAlignment(widget, Qt::AlignCenter);
hLayout->setContentsMargins(10, 0, 20, 0);
widget->setLayout(hLayout);

  1. 在QTableWidget 上添加控件:setCellWidget()
  2. 设置QTableWidget不可编辑/不可选中
    QTableWidgetItem *item = new QTableWidgetItem();
    tabWidget->setItem(2,0,item);
    item->setFlags(item->flags() & ~Qt::ItemIsEnabled & ~Qt::ItemIsSelectable);

右键菜单事件:

a. https://blog.csdn.net/yuanzhangmei1/article/details/7724077

Listtable选择选中的对象:

//选择选中的对象
QItemSelectionModel *selmodel = ui->lv_card_addpro->selectionModel();
if (selmodel)
{
QModelIndexList indexlist = selmodel->selectedIndexes();
int count1 = indexlist.size();
if(0 == count1)
return;
QStringList tmp;
for(auto item:indexlist){
//qDebug()<<item.data().toString();
tmp.push_back(item.data().toString());
}
}
ui->lv_card_addpro->clearSelection();//清空选中项

输入框结束时候,会触发的信号:editingFinished();可以用于判断输入是否合法。

输入框/文本框设置只读:setReadOnly (true)/isReadOnly ()

窗体设置透明:

setAttribute(Qt::WA_TranslucentBackground, true);
QPalette pal = palette();
pal.setColor(QPalette::Background, QColor(0,0,0,100));
setPalette(pal);

如何自定义搜索框:

Wg_SearchLine::Wg_SearchLine(QWidget *parent) : QLineEdit(parent)
{
QPushButton *pSearchButton = new QPushButton(this);

pSearchButton->setCursor(Qt::PointingHandCursor);
pSearchButton->setFixedSize(22, 22);
pSearchButton->setToolTip(QStringLiteral("打开"));
pSearchButton->setStyleSheet("QPushButton{border-image:url(:/new/home/home/date.png); background:transparent;} \
                                     QPushButton:hover{border:2px solid  rgb(52, 178, 237);} \
                                     ");

//防止文本框输入内容位于按钮之下
QMargins margins = this->textMargins();
this->setTextMargins(margins.left(), margins.top(), pSearchButton->width(), margins.bottom());

// this->setPlaceholderText(QStringLiteral(“请输入搜索内容”));

QHBoxLayout *pSearchLayout = new QHBoxLayout();
pSearchLayout->addStretch();
pSearchLayout->addWidget(pSearchButton);
pSearchLayout->setSpacing(0);
pSearchLayout->setContentsMargins(0, 0, 0, 0);
this->setLayout(pSearchLayout);

setStyleSheet("QLineEdit#Wg_SearchLine{background-color: rgb(214, 214, 214);}");
//setEnabled(false);//不可编辑
setFocusPolicy(Qt::NoFocus);//不可获取焦点

connect(pSearchButton, SIGNAL(clicked(bool)), this, SLOT(search()));

}

输入框不可编辑方式

(1)调用lineEdit->setEnabled(false)。确实不可编辑了。不过路径太长时就只能看到后部分了。没关系,再想别的办法就是了。
(2)setFocusPolicy(Qt::NoFocus); 设置它不可获得焦点。OK.不可编辑,又能查看完整的显示文本。

如何打开CHM帮助文档:

QProcess *helpProcess = new QProcess(this);
QStringList argument("./doc/帮助文档V3.0.chm");
//相对路径,文件要放在运行目录下,和数据库文件目录一样。
helpProcess->start(“hh.exe”,argument);

setLayout: Attempting to set QLayout “” on MainWindow “MainWindow”, which already has a layout:

不能直接在Qmainwindow上设置布局。做法是:在QMainWindow上添加一个QWidget,然后再添加布局。

添加到了资源之后,再程序中使用,无法显示。

添加了之后,构建or qmake一下

connect 函数支持Lanbda表达式;(ambda 表达式至少被 MSVC 2010,GCC 4.5,clang 3.1 这几个编译器支持。不过对于后面两个编译器,你需要在编译时加上 -std=c++0x 参数。 )

获取QTableWidget中setCellWidget中控件所在的行列信息

在button的slot函数中,从sender得到button指针,根据这个button的位置(x,y),由tablewidget->itemAt(x,y)可得到modelindex,其中itemAt不受scroll影响.
用这个方法的好处是,从modelindex开始,能完全操作tablewidget.
QPushButton bt = qobject_cast<QPushButton >(sender());
QWidget *obj = qobject_cast<QWidget *>(bt->parent());
int x = obj->frameGeometry().x();//obj为你QPushButton
int y = obj->frameGeometry().y();
QModelIndex index = m_pTableWidget->indexAt(QPoint(x,y));
int row = index.row();
int column = index.column();

输入框有提示性文字

ui->ed_page->setPlaceholderText(“只能输入数字”);

QLineEdit输入完成之后按下回车键,可以实现的获取这个操作的方法:returnPressed()

QTableWidget的清空操作

void QTableWidget::clear () [slot]//清空掉表格内所有内容,包括标题头

Removes all items in the view. This will also remove all selections. The table dimensions stay the same.

void QTableWidget::clearContents () [slot]//这个清空所有内容不包括标题头

Removes all items not in the headers from the view. This will also remove all selections. The table dimensions stay the same.
void QTableWidget::removeColumn ( int column ) [slot]//这个是删除一列,而不是清空表格

Removes the column column and all its items from the table.

void QTableWidget::removeRow ( int row ) [slot]//这个是删除一行,不是清空一行

Removes the row row and all its items from the table.

VS调试QT程序:把QT的debug下的exe程序放在VS的一个项目的debugging–>命令行中(全路径),然后把需要调试的文件在vs打开,设置断点。

Q7实现重启程序

//使用QProcess重启
QString program = QApplication::applicationFilePath();
QString workPath = QDir::currentPath();
QStringList arguments = QApplication::arguments();
QProcess::startDetached(program, arguments, workPath);
QApplication::exit();

Qt界面刷新大量数据时,界面卡死的解决方法

a. 可以使用多线程 moveToThread() ,一条用于业务数据处理,主线程用于刷新界面。

打开与关闭系统软键盘------输入框QLineEidt点击就有osk调出,则是重写鼠标点击事件。

1、cmd命令打开与关闭系统软键盘
运行(Ctrl+R)->cmd
打开:osk
关闭:taskkill /IM osk.exe
2、通过程序打开系统软键盘
头文件中需要加入如下代码:
#include <Windows.h>
#pragma comment(lib, “user32.lib”)
打开软键盘具体实现:
PVOID OldValue;
BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
QString csProcess=“C:\Windows\System32\osk.exe”;
QString params="";
ShellExecute(NULL, L"open", (LPCWSTR)csProcess.utf16(), (LPCWSTR)params.utf16(), NULL, SW_SHOWNORMAL);
if ( bRet )
{
Wow64RevertWow64FsRedirection(OldValue);
}
3、通过程序关闭系统软键盘
首先获取软键盘的句柄,然后发送WM_CLOSE消息。
HWND appWnd;
appWnd = ::FindWindow(L"OSKMainClass", NULL);
if ( appWnd )
{
::SendMessage(appWnd, WM_CLOSE,0, 0);
qDebug() << “closeKeyboard succeed”;
}
else
{
qDebug() << “closeKeyboard failed”;
}
接!

获取桌面路径:QStandardPaths::writableLocation(QStandardPaths::DesktopLocation)

DCB结构中几个比较重要的成员有:BaudRate(波特率)、fParity(指定奇偶校验使能)、Parity(校验方式)、ByteSize(数据位个数)、StopBits(停止位个数)。

BaudRate波特率常用的有CBR_9600、CBR_14400、CBR_19200、CBR_38400、CBR_56000、CBR_57600、CBR_115200、 CBR_128000、 CBR_256000。
fParity指定奇偶校验使能,若此成员为1,允许奇偶校验。
Parity校验方式可以为0~4,对应宏为NOPARITY、ODDPARITY、EVENPARITY、MARKPARITY、SPACEPARITY,分别表示无校验、奇校验、偶校验、校验置位(标记校验)、校验清零。
ByteSize数据位个数可以为5~8位。
StopBits停止位可以为0~2,对应宏为ONESTOPBIT、ONE5STOPBITS、TWOSTOPBITS,分别表示1位停止位、1.5位停止位、2位停止位。

奇偶校验位:

EVENPARITY 偶校验 NOPARITY 无校验 MARKPARITY 标记校验 ODDPARITY 奇校验
停止位
ONESTOPBIT 1位停止位 TWOSTOPBITS 2位停止位
ON 5STOPBITS 1.5位停止位

文件追加形式打开

a. QFile open( QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text)
b. QFile 不必显式关闭文件,变量离开对应的作用域的时候,就会自动关闭。如果要检测数据是否真的被写入,可以调用flush(),return true 则是写入成功。
c. QDataStream 和 QTextStream
QDataStream是二进制流的形式,可以读写的时候,会有对应的字符串长度。
QTextStream是文本的形式去读取数据。
 可以模仿iostream 的选项,在流上设置改变它的状态,如转为16进制等等,也可以作用于QString上,如:
QString str;
QTextStream (&str) << oct << 31 << " " << dec << 25 <<endl; ///str : 37 25\n

窗体重叠,QWidget重叠:

QStackedLayout
QStackedWidget

是否是debug版本运行:#ifdef QT_NO_DEBUG

获取qwidget本身,可以使用单例模式;

选择文件弹窗:文件存在时候,提示覆盖;不存在时候,自己创建。

QFileDialog dialog(this);
dialog.setWindowTitle(tr(“选择文件”));
dialog.setAcceptMode(QFileDialog::AcceptSave);
dialog.setNameFilter(QString(tr("*.csv")));
dialog.setViewMode(QFileDialog::Detail);
if( QFileDialog::Accepted == dialog.exec() ){
QString fileName = dialog.selectedFiles().first();
ui->ed_dir->setText(fileName);

}

CImage转QPixmap

#include <qtwinextras/qwinfunctions.h>
Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0);
CImage *cimage = iter.second.analyte_results[idx].img_ct.get();
QPixmap pix = qt_pixmapFromWinHBITMAP(cimage->Detach());

手动把控件添加到某个widget中

QPushButton* bt_info= new QPushButton(ui->widget);
addWidget() 会使得控件自己形成父子关系

qt不能运行 编译不能构建qmake。:可能包含有中文路径。

setAttribute(Qt::WA_TranslucentBackground, true);//设置为背景透明状

Qt窗口在退出时自动能够delete掉自己,因此,我们在SonDialog的构造函数里,添加这样的一句代码:
setAttribute (Qt::WA_DeleteOnClose);
setAttribute:设置窗体的属性
QCoreApplication::setAttribute( Qt::AA_EnableHighDpiScaling );//支持高分辨率屏幕支持,当屏幕和分辨率不一致的时候可以用

QMetaObject::connectSlotsByName: No matching signal for问题的解决方法

自定义了以o 开头的槽函数

代码实现自定义的控件,需要在样式表中设置,不能使用变量名,需要使用对象名;设置对象名:setObjectName(QStr);

QLineEdit and QComboBox 输入框的自动补全,历史记忆补全;QCompleter

m_Model = new QStandardItemModel(0, 1, this);
m_completer = new QCompleter(m_Model, this);
ui->doctorEdit->setCompleter(m_completer);
ui->addrEdit->setCompleter(m_completer);

//下拉框装入曾经输入过的数据
QSettings historyRead(QString(“Inputhistory.ini”), QSettings::IniFormat);
historyRead.beginGroup(“MainWindow”);
for(int i=0;i<historyRead.allKeys().size();i++)
{
m_InputList.push_back(historyRead.value(historyRead.allKeys().at(i)).toString());
m_Model->insertRow(0);
m_Model->setData(m_Model->index(0, 0), m_InputList.at(i));
}
//写入数据到ini中,
void MainWindow::SaveHistoryIn(QString &strInput)
{
QSettings historyWrite(QString(“Inputhistory.ini”), QSettings::IniFormat);
QSettings historyRead(QString(“Inputhistory.ini”), QSettings::IniFormat);
historyRead.beginGroup(“MainWindow”);

if(!m_InputList.contains(strInput.trimmed())&&!strInput.isEmpty())
{
    historyWrite.setValue(QString("/MainWindow/Input%1").arg(historyRead.allKeys().size()+1), strInput.trimmed());

    m_InputList<<strInput.trimmed();
    m_Model->insertRow(0);
    m_Model->setData(m_Model->index(0, 0),strInput.trimmed());
}

}

查找子类对象。findChildren() ;

a. 例如查找加入到当前窗体的控件对象:this->findChildren();
b. 查找对应类型的对象:this->findChildren<QToolButton *>();

设置控件阴影效果。QGraphicsDropShadowEffect 类, 控件存在的方法:setGraphicsEffect() 【属于QWidget类】

使用桌面服务,简单而言使用一些window自带的程序或者默认程序。QDesktopServices

a. 例如打开一个 .chm 文件:QDesktopServices::openUrl(QUrl(path))

widget背景图片自适应大小

1 说明widget要想使背景图片拉伸自适应大小,setsheetstyle的时候应该使用border-image,而不是background-image,如果使用的background-image那么图片会以填充的方式自适应大小

2 QLabel 的pixmap自适应大小 setScaledContents(true);

processEvents(); qApp->processEvents() 可以让根据指定的标志处理调用线程的所有挂起事件,直到不再有事件需要处理为止。执行一个长时间的/耗时的操作,可以偶尔调用此函数。

按钮实现快捷键:在designer界面上属性的shortcut可以设置,直接按下对应的按钮即可。

移动到父窗体的中央位置:

if(parent)
move(parent->geometry().center()-this->rect().center());

qt下生成pdb文件:在pro文件

QMAKE_CXXFLAGS_RELEASE = Q M A K E C F L A G S R E L E A S E W I T H D E B U G I N F O Q M A K E L F L A G S R E L E A S E = QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = QMAKECFLAGSRELEASEWITHDEBUGINFOQMAKELFLAGSRELEASE=QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

分裂器:QSliptter;

a. splitter->setStyleSheet(“QSplitter::handle { background-color:gray}”); //设置分界线的样式

QEventLoop: 事件圈;

a. 定时5s
b.

设置窗口置顶:setWindowFlags(box.windowFlags() | Qt::WindowStaysOnTopHint);

• 设置程序窗体为顶层活动窗体,每次都是会在最前端
MainWidget w;
w.show();
w.raise();
w.activateWindow();

• QDialog中,close 或者accept 等会把主窗体也消失的。是因为没有把this传入。
• 删除控件,删除widget上的控件,layout上的控件,动态删除/添加控件
a. QWidget有一个setParent方法,当setParent(NULL)时就会使其不在相应的界面上显示。如果不设置,即便删除了layout,QWidget还是会显示在界面上
QGridLayout* layout = (QGridLayout*)ui->frame_pro->layout();
QLayoutItem child;
while ((child = layout->takeAt(0)) != 0) {
// //setParent为NULL,防止删除之后界面不消失
if(child->widget())
{
child->widget()->setParent(nullptr);
}
layout->removeWidget(child->widget());
delete child;
}
//添加
QPushButton bt =new QPushButton(text, ui->frame_pro);
bt->setFixedSize(120,40);
bt->setCheckable(true);
connect(bt, SIGNAL(clicked()), this, SLOT(bt_pro_clicked()));
QGridLayout
layout = (QGridLayout
)ui->frame_pro->layout();
layout->addWidget(bt,row, col);

• qt5.11.1调试时出现变量“无法访问”问题解决,去除下图勾选

导出CSV文件。

参考网站:https://blog.csdn.net/mingxia_sui/article/details/7683030
https://blog.csdn.net/qq_40194498/article/details/79726388

//获取路径
QFileDialog dialog(this);
dialog.setWindowTitle(tr(“选择导出文件”));
dialog.setAcceptMode(QFileDialog::AcceptSave);
dialog.setNameFilter(QString(tr("*.csv")));
dialog.setViewMode(QFileDialog::Detail);
if( QFileDialog::Rejected == dialog.exec() ){
return;
}
//创建文件CSV
QString filename = dialog.selectedFiles().first();
QFile file(filename);
//存在打开,不存在创建
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
qDebug() << “Cannot open file for writing: "
<< file.errorString();
messboxWarn(tr(“导出失败!”));
return;
}
//写入内容
QTextStream out(&file);
for(int i =0;icolumnCount(); ++i){
out<horizontalHeaderItem(i)->text()<<”,";
}
out<<"\n";

让QDialog置顶:属性里“QDialog”下有个“modal”(模式对话框)选项,勾选即可

读取tablewidget里面的内容item的时候,需要判断该item是否存在。table处理过程中,最容易出错的是,获取行列、item时候,访问不存在的对象。

不能编译error: C1083: 无法打开包括文件: “type_traits”: No such file or directory:

使用脚本打开qtcreater;
cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
vcvarsall.bat x86 8.1
cd C:\Qt\Qt5.9.7\Tools\QtCreator\bin
qtcreator.exe

QTextStream 读取文件内容时,中文乱码;

a. .setCodec(“utf-8”);

获取文件夹下全部文件名称:

QStringList getFileNames(const QString &path)
{
QDir dir(path);
QStringList nameFilters;
nameFilters << “.jpg" << ".png”;
QStringList files = dir.entryList(nameFilters, QDir::Files|QDir::Readable, QDir::Name);
return files;
}

QTextStream和QFile文本文件读入时换行符的问题

QTextStream:qstr中去掉了换行符’\n’
QFile:qstr中保留了换行符’\n’
QFile file(“1.txt”);
QTextStream in(&file);
QString qstr=in.readLine();
QString qstr=file.readLine();

判断是否为数值\实数\数值类型,可以使用正则表达式:

QRegExp rx("1?\d+(\.\d+)?$");//实数
// rx.setPatternSyntax(QRegExp::Wildcard);
bool b = rx.exactMatch(item);

设置系统时间

设置系统时间:SetLocalTime设置北京时间;SetSystemTime设置格林威治时间,比北京时间晚8小时,需要调整wHour。

SYSTEMTIME ti;
GetSystemTime(&ti);
ti.wYear = 2018;
ti.wMonth = 3;
ti.wDay = 5;
SetSystemTime(&st); // 更改年月日。

正确解决:坑爹的0xc000007b——应用程序无法正常启动

a. 一般是dll库的版本不对。X86 X64
b. 或者不存在动态库。
79. warning LNK4042: 对象被多次指定;已忽略多余的指定
在pro文件中,包含了多个重复文件

当控件随着窗体的大小发生变化or显示窗体时候,需要做一些逻辑/UI的处理,不应该在代码里面控制这些实现,加了布局之后,会使得大小不是想要的大小。可以使用事件来实现QEvent::Show

bool CMessageBox_Dlg::event(QEvent *event)
{
if(event->type() == QEvent::Show)
{
doSomething();
}

return QDialog::event(event);

}


  1. +- ↩︎

  • 1
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值