中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

青島微網(wǎng)站開發(fā)長沙關(guān)鍵詞優(yōu)化平臺

青島微網(wǎng)站開發(fā),長沙關(guān)鍵詞優(yōu)化平臺,北辰正方建設(shè)集團(tuán)有限公司官方網(wǎng)站,深圳坪山新聞QT的繪圖系統(tǒng)(QPainterDevice)與文件系統(tǒng)(QIODevice) 文章目錄 1、Qt 的繪圖系統(tǒng)1、QPainter的使用2、QPen(畫筆)及QBursh(畫刷)3、手動更新窗口4、繪圖設(shè)備1、四種繪圖設(shè)備的 區(qū)別2、 QBitmap3…

QT的繪圖系統(tǒng)(QPainterDevice)與文件系統(tǒng)(QIODevice)

文章目錄

  • 1、Qt 的繪圖系統(tǒng)
    • 1、QPainter的使用
    • 2、QPen(畫筆)及QBursh(畫刷)
    • 3、手動更新窗口
    • 4、繪圖設(shè)備
        • 1、四種繪圖設(shè)備的 區(qū)別
        • 2、 QBitmap
        • 3、QPixmap
        • 4、 QImage
        • 5、QPicture
        • 6、QImage與QPixmap的轉(zhuǎn)換
  • 2、不規(guī)則窗口
  • 3、文件系統(tǒng)
    • 1、QFile文件的讀寫
    • 2、QT的QString與QByteArray以及char *的相互轉(zhuǎn)換
    • 3、文件信息QFileInfo類
    • 4、二進(jìn)制文件讀寫 QDataStream類(打開是看不懂)
    • 5、文本文件讀寫QTextStream類
    • 6、內(nèi)存讀寫QBuffer類
  • 4、總結(jié)


1、Qt 的繪圖系統(tǒng)

Qt 的繪圖系統(tǒng)允許使用相同的 API 在屏幕和其它打印設(shè)備上進(jìn)行繪制。整個繪圖系統(tǒng)基于QPainterQPainterDeviceQPaintEngine三個類。
在這里插入圖片描述
下圖給出了這三個類之間的層次結(jié)構(gòu):
在這里插入圖片描述
上面的示意圖告訴我們,Qt 的繪圖系統(tǒng)實(shí)際上是,使用QPainter在QPainterDevice上進(jìn)行繪制,它們之間使用QPaintEngine進(jìn)行通訊(也就是翻譯QPainter的指令)。

1、QPainter的使用

對窗口繪圖首先要重寫**void paintEvent(QPaintEvent *)**虛函數(shù)。

  1. 重寫繪圖事件,虛函數(shù)
  2. 如果在窗口繪圖,必須放在繪圖事件里實(shí)現(xiàn)
  3. 繪圖事件內(nèi)部自動調(diào)用,窗口需要重繪的時候(狀態(tài)改變)
void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//指定當(dāng)前窗口為繪圖設(shè)備p.drawPixmap(rect(), QPixmap("../Image/bk.jpg"));     //畫背景圖//畫直線p.drawLine(50, 50, 150, 50); /* 在坐標(biāo)50,50的位置畫長150,寬50的線 */p.drawLine(50, 50, 50, 150);//畫矩形;l;dp.drawRect(150, 150, 100, 50);//畫圓形p.drawEllipse(QPoint(150, 150), 50, 25);
}

注意:在上層目錄要有背景圖的存在。要先畫背景圖在畫直線,矩形,圓形。
指定QQidget對象為繪圖對象。即窗口是繪圖設(shè)備。QQidget繼承與QPaintDevice.
在這里插入圖片描述

2、QPen(畫筆)及QBursh(畫刷)

QPainter有很多以 draw 開頭的函數(shù),用于各種圖形的繪制,比如drawLine(),drawRect()以及drawEllipse()等。
如果需要設(shè)置畫家的顏色,風(fēng)格,線條的粗細(xì)。從而引入畫筆。如果需要填充圖形的顏色需要畫刷。

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//指定當(dāng)前窗口為繪圖設(shè)備//畫背景圖p.drawPixmap(rect(), QPixmap("../Image/bk.jpg"));//定義畫筆QPen pen;pen.setWidth(5); //設(shè)置線寬pen.setColor( QColor(14, 9, 234) );//rgb設(shè)置顏色pen.setStyle(Qt::DashLine); //設(shè)置風(fēng)格p.setPen(pen); //把畫筆交給畫家QBrush brush; //創(chuàng)建畫刷對象brush.setColor(Qt::red); //設(shè)置顏色brush.setStyle(Qt::Dense1Pattern);//設(shè)置樣式p.setBrush(brush);//把畫刷交給畫家//畫直線p.drawLine(50, 50, 150, 50); /* 在坐標(biāo)50,50的位置畫長150,寬50的線 */p.drawLine(50, 50, 50, 150);//畫矩形;l;dp.drawRect(200, 200, 100, 50);//畫圓形p.drawEllipse(QPoint(150, 150), 50, 25);
}

3、手動更新窗口

當(dāng)我們在窗口繪制的圖不斷變化時。需要不斷地刷新窗口才會有變化。否則不會有。
mywidget.h

class MyWidget : public QWidget
{Q_OBJECT
public:MyWidget(QWidget *parent = nullptr);~MyWidget();void paintEvent(QPaintEvent *);
private:int x;QPushButton *button;
private slots:void FunSlot(void);
private:Ui::MyWidget *ui;
};

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QPainter>MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);x = 0;QPushButton *button = new QPushButton(this);button->setText("向右移動");connect(button, &QPushButton::pressed, this, &MyWidget::FunSlot);
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//畫笑臉p.drawPixmap(x, 180, 80, 80, QPixmap("../Image/face.png"));}
void MyWidget::FunSlot(void)
{x += 20;if(x > width()- 80){x = 0;}//刷新窗口,讓窗口重繪,整個窗口都刷新update(); //間接調(diào)用paintEvent()
}

點(diǎn)擊按鈕繪圖不斷向右移動變化。到窗口終點(diǎn)又回到起點(diǎn)。

4、繪圖設(shè)備

1、四種繪圖設(shè)備的 區(qū)別

繪圖設(shè)備是指繼承QPainterDevice的子類。Qt一共提供了四個這樣的類,分別是QPixmap、QBitmap、QImage和 QPicture。
在這里插入圖片描述
**QBitmap:**是QPixmap的一個子類,它的色深限定為1,可以使用 QPixmap的isQBitmap()函數(shù)來確定這個QPixmap是不是一個QBitmap。
總結(jié):它們操作都方法都是差不多一樣的。

2、 QBitmap

QBitmap只有黑白兩種顏色。

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);//QPixmap 圖片背景透明p.drawPixmap(0, 0, QPixmap("../Image/face.png"));//QBitmap 圖片背景透明p.drawPixmap(200, 0, QBitmap("../Image/face.png"));//QPixmap 圖片背景白色QPixmap pixmap;pixmap.load("../Image/image.jpg");p.drawPixmap(0, 200, pixmap);//QBitmap 圖片背景白色QBitmap bitmap;bitmap.load("../Image/image.jpg");p.drawPixmap(400, 200, bitmap);
}

在這里插入圖片描述
右邊為QBitmap 左邊為QPixmap。上面的QBitmap為黑色背景。下面為QBitmap的白色背景。

3、QPixmap

如下在QPixmap繪圖而不是在窗口。不用重寫繪圖事件。在構(gòu)造函數(shù)里實(shí)現(xiàn)即可。

MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);//繪圖設(shè)備, 400*300QPixmap pixmap(400, 300);QPainter p(&pixmap);//畫筆填充白色背景色//p.fillRect(0, 0, 400, 300, QBrush(Qt::white));//畫家填充白色背景色pixmap.fill(Qt::white);p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));//上層路徑保存圖片pixmap.save("../pixmap.jpg");
}

在上層目錄生成pixmap.jpg文件。
在這里插入圖片描述

4、 QImage

QImage可以對像素點(diǎn)進(jìn)行操作。

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//創(chuàng)建一個繪圖設(shè)備,QImage::Format_ARGB32背景是透明QImage image(400, 300, QImage::Format_ARGB32);QPainter p;p.begin(&image);//繪圖p.drawImage(0, 0, QImage("../Image/image.jpg"));//對繪圖設(shè)備前50個像素點(diǎn)進(jìn)行操作for(int i = 0; i < 50; i++){for(int j = 0; j < 50; j++){image.setPixel(QPoint(i, j), qRgb(0, 255, 0)); /* 設(shè)置像素點(diǎn) *///image.pixel(QPoint(i, j)); /* 獲取像素點(diǎn) */}}p.end();image.save("../image.png"); // 保存圖片
}

在上層目錄生成image.png文件。綠色部分為對像素點(diǎn)的操作。
在這里插入圖片描述

5、QPicture
MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);QPicture picture;QPainter p;p.begin(&picture);p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));p.drawLine(50, 50, 150, 50);p.end();//保存的是二進(jìn)制文件picture.save("../picture.png");
}

在這里插入圖片描述
在上層路徑生成picture.png的二進(jìn)制文件。
二進(jìn)制打開也看不出效果。我們在窗口里加載出來。重寫繪圖事件。

void MyWidget::paintEvent(QPaintEvent *)
{QPicture pic;pic.load("../picture.png"); //加載二進(jìn)制picture.png文件QPainter p(this);p.drawPicture(0, 0, pic);
}

運(yùn)行結(jié)果如下:
在這里插入圖片描述

6、QImage與QPixmap的轉(zhuǎn)換

在對屏幕進(jìn)行優(yōu)化可能需要用到QPixmap。在傳輸可能需要用到QImage。

void MyWidget::paintEvent(QPaintEvent *)
{QPainter p(this);QPixmap pixmap;pixmap.load("../Image/face.png");//QPixmap -> QImageQImage tempImage = pixmap.toImage();p.drawImage(0, 0, tempImage);QImage image;image.load("../Image/face.png");//QImage -> QPixmapQPixmap tempPixmap = QPixmap::fromImage(image);p.drawPixmap(200, 0, tempPixmap);
}

運(yùn)行結(jié)果:
在這里插入圖片描述
第一張是通過QPixmap轉(zhuǎn)QImage畫的。第二張是通過QImage轉(zhuǎn)QPixmap畫的。

2、不規(guī)則窗口

常見的窗體是各種方形的對話框,但有時候也需要非方形的窗體,如圓形,橢圓甚至是不規(guī)則形狀的對話框。
widget.h

class Widget : public QWidget
{Q_OBJECT
public:explicit Widget(QWidget *parent = 0);~Widget();protected:void paintEvent(QPaintEvent *);void mouseMoveEvent(QMouseEvent *e);void mousePressEvent(QMouseEvent *e);
private:QPoint p;
private:Ui::Widget *ui;
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//去窗口表框Qt::FramelessWindowHint   windowFlags()其它屬性不變setWindowFlags(Qt::FramelessWindowHint | windowFlags());//把窗口背景設(shè)置為透明setAttribute(Qt::WA_TranslucentBackground);
}Widget::~Widget()
{delete ui;
}void Widget::paintEvent(QPaintEvent *)
{QPainter p(this);p.drawPixmap(0, 0, QPixmap("../Image/sunny.png"));
}void Widget::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::RightButton){//如果是右鍵close();}else if(e->button() == Qt::LeftButton){//求坐標(biāo)差值//當(dāng)前點(diǎn)擊坐標(biāo)(屏幕)-窗口左上角坐標(biāo)p = e->globalPos() - this->frameGeometry().topLeft();}
}void Widget::mouseMoveEvent(QMouseEvent *e)
{/* 移動加鼠標(biāo)左鍵按下 */if(e->buttons() & Qt::LeftButton){move(e->globalPos() - p); // 當(dāng)前點(diǎn)擊坐標(biāo)(屏幕) -  求坐標(biāo)差值}
}

當(dāng)鼠標(biāo)左鍵按下移動無規(guī)則窗口跟著移動。鼠標(biāo)右鍵按下則無規(guī)則窗口關(guān)閉。
如下圖片關(guān)于上面代碼的坐標(biāo)計算的示意圖
在這里插入圖片描述

3、文件系統(tǒng)

文件操作是應(yīng)用程序必不可少的部分。Qt 作為一個通用開發(fā)庫,提供了跨平臺的文件操作能力。Qt 通過QIODevice提供了對 I/O 設(shè)備的抽象,這些設(shè)備具有讀寫字節(jié)塊的能力。下面是 I/O 設(shè)備的類圖(Qt5):
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

1、QFile文件的讀寫

QFile提供了從文件中讀取和寫入數(shù)據(jù)的能力。
我們通常會將文件路徑作為參數(shù)傳給QFile的構(gòu)造函數(shù)。不過也可以在創(chuàng)建好對象最后,使用setFileName()來修改。
ui界面如下:
在這里插入圖片描述
功能:把讀取到文件顯示在文本框里。把文本框里的內(nèi)容保存成文件。

#include "mywidget.h"
#include "ui_mywidget.h"
#include<QFile>
#include<QFileDialog>
#include<QDebug>MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);connect(ui->pushButtonRead, &QPushButton::pressed, this, &MyWidget::ReadSlot);connect(ui->pushButtonWrite, &QPushButton::pressed, this, &MyWidget::WriteSlot);
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::ReadSlot(void)
{QString path = QFileDialog::getOpenFileName(this,"open", "../", "TXT(*.txt)");if(path.isEmpty() == false){//文件對象QFile file(path);//打開文件,只讀方式bool isOk = file.open(QIODevice::ReadOnly);if(isOk == true){
// 一次讀取全部
#if 0 \//讀文件,默認(rèn)只識別utf8編碼 在文件流才可以改變編碼格式QByteArray array = file.readAll();//顯示到編輯區(qū)//ui->textEdit->setText(QString(array));//ui->textEdit->setText(array);
#endif// 一次讀取一行QByteArray array;while( file.atEnd() == false){//讀一行array += file.readLine();}ui->textEdit->setText(array);}//關(guān)閉文件file.close();}
}void MyWidget::WriteSlot(void)
{QString path = QFileDialog::getSaveFileName(this, "save", "../", "TXT(*.txt)");if(path.isEmpty() == false){QFile file; //創(chuàng)建文件對象//關(guān)聯(lián)文件名字file.setFileName(path);//打開文件,只寫方式bool isOk = file.open(QIODevice::WriteOnly); /* 有就打開否則創(chuàng)建 */if(isOk == true){//獲取編輯區(qū)內(nèi)容QString str = ui->textEdit->toPlainText();//寫文件file.write(str.toUtf8());}file.close();}
}

2、QT的QString與QByteArray以及char *的相互轉(zhuǎn)換

            // QString -> QByteArrayfile.write(str.toUtf8());//QString -> c++ string -> char *file.write(str.toStdString().data());//轉(zhuǎn)換為本地平臺編碼file.write(str.toLocal8Bit());//QString -> QByteArrayQString buf = "123";QByteArray a = buf.toUtf8(); //中文a = buf.toLocal8Bit(); //本地編碼//QByteArray -> char *char *b = a.data();//char * -> QStringchar *p = "abc";QString c = QString(p);

3、文件信息QFileInfo類

在這里插入圖片描述

#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>QString path = QFileDialog::getOpenFileName(this, "open", "../");if(path.isEmpty() == false){//獲取文件信息QFileInfo info(path);qDebug() << "文件名字:" << info.fileName().toUtf8().data();qDebug() << "文件后綴:" << info.suffix();qDebug() << "文件大小:" << info.size();qDebug() << "文件創(chuàng)建時間:" <<info.birthTime().toString("yyyy-MM-dd hh:mm:ss"); //2024-01-04 15:13:00}

4、二進(jìn)制文件讀寫 QDataStream類(打開是看不懂)

在這里插入圖片描述
mywidget.h

#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACEclass MyWidget : public QWidget
{Q_OBJECTpublic:MyWidget(QWidget *parent = nullptr);~MyWidget();void writeData();void readData();
private:Ui::MyWidget *ui;
};

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDataStream>
#include <QFile>
#include <QDebug>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);writeData();readData();
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::writeData()
{//創(chuàng)建文件對象QFile file("../hello.txt");//打開文件, 只寫方式打開bool isOk = file.open(QIODevice::WriteOnly);if(true == isOk){//創(chuàng)建數(shù)據(jù)流,和file文件關(guān)聯(lián)//往數(shù)據(jù)流中寫數(shù)據(jù),相當(dāng)于往文件里寫數(shù)據(jù)QDataStream stream(&file);stream << QString("你好") << 777;file.close();}}void MyWidget::readData()
{//創(chuàng)建文件對象QFile file("../hello.txt");//打開文件, 只讀方式打開bool isOk = file.open(QIODevice::ReadOnly);if(true == isOk){//創(chuàng)建數(shù)據(jù)流,和file文件關(guān)聯(lián)//往數(shù)據(jù)流中讀數(shù)據(jù),相當(dāng)于往文件里讀數(shù)據(jù)QDataStream stream(&file);//讀的時候,按寫的順序取數(shù)據(jù)QString str;int a;stream >> str >> a;//qDebug() << str.toUtf8().data() << a;cout << str.toUtf8().data() << a;file.close();}
}

先寫入數(shù)據(jù)流(二進(jìn)制形式),然后以寫的順序讀出來。
需要注意的是,你必須按照寫入的順序,將數(shù)據(jù)讀取出來。順序顛倒的話,程序行為是不確定的,嚴(yán)重時會直接造成程序崩潰。
那么,既然QIODevice提供了read()、readLine()之類的函數(shù),為什么還要有QDataStream呢?QDataStream同QIODevice有什么區(qū)別?區(qū)別在于,QDataStream提供流的形式,性能上一般比直接調(diào)用原始 API 更好一些。

5、文本文件讀寫QTextStream類

在這里插入圖片描述
ui界面:
在這里插入圖片描述

widget.h

#include <QWidget>namespace Ui {
class Widget;
}
class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void writeData();
private slots:void on_pushButton_clicked();
private:Ui::Widget *ui;
};

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QTextStream>
#include <QFile>
#include <QDebug>
#include <QFileDialog>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);writeData();}Widget::~Widget()
{delete ui;
}void Widget::writeData()
{QFile file;file.setFileName("../TextStream.txt");bool isOk = file.open(QIODevice::WriteOnly);if(true == isOk){QTextStream stream(&file);//指定編碼stream.setEncoding(QStringConverter::Utf8);stream << QString("你好") << 777;file.close();}
}void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getOpenFileName(this,"open", "../"  );if(false == path.isEmpty()){QFile file;file.setFileName(path);bool isOk = file.open(QIODevice::ReadOnly);if(true == isOk){QTextStream stream(&file);//指定編碼stream.setEncoding(QStringConverter::Utf8);QString str = stream.readAll();ui->textEdit->setText(str);file.close();}}
}

當(dāng)使用QDataStream寫入的時候,實(shí)際上會在要寫入的內(nèi)容前面,額外添加一個這段內(nèi)容的長度值。而以文本形式寫入數(shù)據(jù),是沒有數(shù)據(jù)之間的分隔的。因此,使用文本文件時,很少會將其分割開來讀取,而是使用諸如使用:
QTextStream::readLine() 讀取一行
QTextStream::readAll()讀取所有文本。

6、內(nèi)存讀寫QBuffer類

    QByteArray array;QBuffer memFile(&array); //創(chuàng)建內(nèi)存文件 還指定QByteArray對象memFile.open(QIODevice::WriteOnly);memFile.write("5455454");memFile.write("6564565");memFile.close();qDebug() << memFile.buffer();qDebug() << "array:" << array;

寫進(jìn)了內(nèi)存也保存在了指定的QByteArray對象里。

QBuffer與QDataStream一起操作dome。

    QBuffer memFile1;memFile1.open(QIODevice::WriteOnly); /* 只寫 */QDataStream stream(&memFile1); /* QBuffer與QDataStream關(guān)聯(lián) */stream << QString("測試") << 999;memFile1.close();/* 關(guān)閉文件 */qDebug() <<  memFile1.buffer();memFile1.open(QIODevice::ReadOnly); /* 只讀 */QDataStream in;in.setDevice(&memFile1);QString str;int a;in >> str >> a;memFile1.close(); /* 關(guān)閉文件 */qDebug() << str.toUtf8().data() << a;qDebug() <<  memFile1.buffer();

運(yùn)行結(jié)果:
在這里插入圖片描述

4、總結(jié)

例如:以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了QT的繪圖系統(tǒng)與文件系統(tǒng)。

http://m.risenshineclean.com/news/48378.html

相關(guān)文章:

  • 企業(yè)推廣語句東莞seo顧問
  • 東莞 包裝制品 東莞網(wǎng)站建設(shè)產(chǎn)品市場推廣方案范文
  • 長春疫情最新消息今天新增病例軌跡千度seo
  • 十大購物網(wǎng)站排名全自動引流推廣軟件
  • 做地方特產(chǎn)的網(wǎng)站最火的網(wǎng)絡(luò)銷售平臺
  • asp網(wǎng)站漏洞修復(fù)插件南京網(wǎng)站制作公司
  • 織夢網(wǎng)站管理系統(tǒng)廊坊seo管理
  • 昌吉網(wǎng)站建設(shè)電話百度關(guān)鍵詞網(wǎng)站排名優(yōu)化軟件
  • 天津企業(yè)網(wǎng)站建設(shè)一條龍網(wǎng)推資源渠道
  • 廣州做網(wǎng)站設(shè)計百度seo推廣軟件
  • web網(wǎng)站如何做負(fù)載均衡谷歌搜索引擎google
  • 網(wǎng)站做微信公眾號輿情網(wǎng)站入口
  • 義烏外貿(mào)公司聯(lián)系方式南寧seo排名首頁
  • 網(wǎng)站備案真實(shí)性核驗(yàn)網(wǎng)站seo方案策劃書
  • 沒有做老千的斗牛網(wǎng)站6網(wǎng)絡(luò)營銷專業(yè)課程
  • 四平網(wǎng)站建設(shè)404頁面對網(wǎng)站的好處及設(shè)置方法百度一下馬上知道
  • 網(wǎng)絡(luò)規(guī)劃設(shè)計師證書圖片seo引擎優(yōu)化公司
  • 做設(shè)計的搜素材上什么網(wǎng)站廣州優(yōu)化營商環(huán)境條例
  • 哈爾濱網(wǎng)站建設(shè)教程seo站長助手
  • 石臺做網(wǎng)站新的營銷模式有哪些
  • wordpress網(wǎng)址轉(zhuǎn)跳插件seo是什么專業(yè)的課程
  • ps做網(wǎng)站頁面設(shè)置為多大seo推廣優(yōu)化工具
  • 標(biāo)題優(yōu)化方法百度網(wǎng)站免費(fèi)優(yōu)化軟件下載
  • php企業(yè)網(wǎng)站源代碼網(wǎng)站優(yōu)化方式有哪些
  • 網(wǎng)站開發(fā)論文題目seo排名系統(tǒng)源碼
  • 網(wǎng)站的ci設(shè)計怎么做優(yōu)化網(wǎng)站打開速度
  • 網(wǎng)站開發(fā) 外包空心cba最新排名
  • javaweb一個旅游網(wǎng)站怎么做無憂軟文網(wǎng)
  • 新聞網(wǎng)站個人可以做嗎軟文寫作范例大全
  • wordpress插件分享顯示官網(wǎng)seo關(guān)鍵詞排名系統(tǒng)