日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

Qt笔记总结

發(fā)布時(shí)間:2024/9/27 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt笔记总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Qt筆記總結(jié)

作者:hackett

微信公眾號:加班猿

一、常用控件
按鈕類
QPushButton

QtoolButton

QRadioButton

item
QListWidget

容器類
QStackWidget

QWidget

QFrame

編輯類
QComboBox

QLineEdit

QTextEdit

顯示類
QLabel

setOpenExternalLinks()設(shè)置為true自動(dòng)打開,false要打開鏈接需要捕捉linkActivated()信號

//顯示普通文本字符串
QLable *label = new QLable;
label->setText(“Hello, World!”);
//顯示HTML格式的字符串
QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">
百度一下</a></h1>");
label ->setOpenExternalLinks(true);

QLabel * label = new QLabel(this);
label ->setText("Hello, World");
label ->setText("<h1><a href=\"https://www.baidu.com\">
百度一下</a></h1>");
// label->setOpenExternalLinks(true);
connect(label, &QLabel::linkActivated,?
this, &MyWidget::slotOpenUrl);

//槽函數(shù)?? ?
void MyWidget::slotOpenUrl(const QString &link)
{
? ? QDesktopServices::openUrl(QUrl(link));
}

QProcessBar

QMessageBox

二、信號與槽
信號和槽
信號槽,實(shí)際就是觀察者模式。當(dāng)某個(gè)事件發(fā)生之后,它就會(huì)發(fā)出一個(gè)信號(signal)將想要處理的信號和自己的一個(gè)函數(shù)(稱為槽(slot))綁定來處理這個(gè)信號。當(dāng)信號發(fā)出時(shí),被連接的槽函數(shù)會(huì)自動(dòng)被回調(diào)。

1、connect(sender, signal, receiver, slot);
1
sender:發(fā)送信號的對象
signal:發(fā)送對象發(fā)出的信號
receiver:接收信號的對象
slot:接收對象在接收到信號之后所需要調(diào)用的函數(shù)
例如:

/* &b1: 信號發(fā)出者,指針類型
* &QPushButton::pressed:處理的信號?? ?(&發(fā)送者的類名::信號名字)
* this: 信號接收者
* &MainWidget::close:槽函數(shù),信號處理函數(shù) (&接收的類名::槽函數(shù)名字)
*/
connect(&b1, &QPushButton::pressed, this, &MainWidget::close);

自定義信號槽
自定義信號槽需要注意的事項(xiàng)
發(fā)送者和接收者都需要是QObject的子類(當(dāng)然,槽函數(shù)是全局函數(shù)、Lambda 表達(dá)式等無需接收者的時(shí)候除外);

使用 signals 標(biāo)記信號函數(shù),信號是一個(gè)函數(shù)聲明,返回 void,不需要實(shí)現(xiàn)函數(shù)代碼;

槽函數(shù)是普通的成員函數(shù),作為成員函數(shù),會(huì)受到 public、private、protected 的影響;

使用 emit 在恰當(dāng)?shù)奈恢冒l(fā)送信號;

使用QObject::connect()函數(shù)連接信號和槽。

任何成員函數(shù)、static 函數(shù)、全局函數(shù)和 Lambda 表達(dá)式都可以作為槽函數(shù)

/* 自定義槽,普通函數(shù)的用法
* Qt5:任意的成員函數(shù),普通全局函數(shù),靜態(tài)函數(shù)
* 槽函數(shù)需要和信號一致(參數(shù),返回值)
* 由于信號都是沒有返回值,所以,槽函數(shù)一定沒有返回值
*/
connect(b2, &QPushButton::released, this, &MainWidget::mySlot);

Lambda表達(dá)式
C++11中的Lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對象。

基本構(gòu)成:[函數(shù)對象參數(shù)](操作符重載函數(shù)參數(shù))mutable或exception ->返回值{函數(shù)體}

1、函數(shù)對象參數(shù):

[ ] 標(biāo)識一個(gè)Lambda的開始,這部分必須存在,不能省略。

空,沒有任何函數(shù)對象參數(shù)

=,值傳遞方式(作用范圍:所有可見的局部變量以及所在類的this)

&,引用傳遞方式(作用范圍:所有可見的局部變量以及所在類的this)

this,函數(shù)體內(nèi)可以可以使用Lambda所在類中的成員變量

a,把a(bǔ)按值進(jìn)行傳遞(默認(rèn)為const不可修改,可添加mutable修飾符修改)

&b,把b按引用進(jìn)行傳遞

&,a,b,除a和b進(jìn)行值傳遞,其他參數(shù)按引用進(jìn)行傳遞

2、操作符重載函數(shù)參數(shù):

標(biāo)識重載的()操作符的參數(shù),沒有參數(shù)時(shí),這部分可以省略。

3、可修改標(biāo)示符:

mutable聲明,這部分可以省略。按值傳遞函數(shù)對象參數(shù)時(shí),加上mutable修飾符后,可以修改按值傳遞進(jìn)來的拷貝(注意是能修改拷貝,而不是值本身)。

4、錯(cuò)誤拋出標(biāo)示符:

exception聲明,這部分也可以省略。exception聲明用于指定函數(shù)拋出的異常,如拋出整數(shù)類型的異常,可以使用throw(int)

5、函數(shù)返回值:

->返回值類型,標(biāo)識函數(shù)返回值的類型,當(dāng)返回值為void,或者函數(shù)體中只有一處return的地方(此時(shí)編譯器可以自動(dòng)推斷出返回值類型)時(shí),這部分可以省略。

6、函數(shù)體:

{},標(biāo)識函數(shù)的實(shí)現(xiàn),這部分不能省略,但函數(shù)體可以為空。

?

三、Qt窗口系統(tǒng)
1、坐標(biāo)體系
以左上角為原點(diǎn),X向右增加,Y向下增加。

2、QWidget
所有窗口及窗口控件都是從QWidget直接或間接派生出來的。

對象模型

Qt創(chuàng)建對象的時(shí)候會(huì)提供一個(gè)Parent對象指針

在創(chuàng)建QObject對象時(shí),可以提供一個(gè)其父對象,我們創(chuàng)建的這個(gè)QObject對象會(huì)自動(dòng)添加到其父對象的children()列表。當(dāng)父對象析構(gòu)的時(shí)候,這個(gè)列表中的所有對象也會(huì)被析構(gòu)。(注意,這里的父對象并不是繼承意義上的父類!)

QWidget是能夠在屏幕上顯示的一切組件的父類

QWidget繼承自QObject,因此也繼承了這種對象樹關(guān)系。一個(gè)孩子自動(dòng)地成為父組件的一個(gè)子組件,也可以自己刪除子對象,它們會(huì)自動(dòng)從其父對象列表中刪除。

當(dāng)一個(gè)QObject對象在堆上創(chuàng)建的時(shí)候,Qt 會(huì)同時(shí)為其創(chuàng)建一個(gè)對象樹。不過,對象樹中對象的順序是沒有定義的。這意味著,銷毀這些對象的順序也是未定義的

任何對象樹中的 QObject對象 delete 的時(shí)候,如果這個(gè)對象有 parent,則自動(dòng)將其從 parent 的children()列表中刪除;如果有孩子,則自動(dòng) delete 每一個(gè)孩子。Qt 保證沒有QObject會(huì)被 delete 兩次,這是由析構(gòu)順序決定的。

3、QMainWindow
QMainWindow是一個(gè)為用戶提供主窗口程序的類,包含一個(gè)菜單欄(menu bar)、多個(gè)工具欄(tool bars)、多個(gè)錨接部件(dock widgets)、一個(gè)狀態(tài)欄(status bar)及一個(gè)中心部件(central widget)

1、菜單欄

創(chuàng)建菜單欄,通過QMainWindow類的menubar() 函數(shù)獲取主窗口菜單欄指針

QMenuBar *?? ?menuBar() const
1
創(chuàng)建菜單,調(diào)用QMenu的成員函數(shù)addMenu() 來添加菜單

QAction* addMenu(QMenu * menu)
QMenu* addMenu(const QString & title)
QMenu* addMenu(const QIcon & icon, const QString & title)

創(chuàng)建菜單項(xiàng),調(diào)用QMenu的成員函數(shù)addAction() 來添加菜單項(xiàng)

QAction* activeAction() const
QAction* addAction(const QString & text)
QAction* addAction(const QIcon & icon, const QString & text)
QAction* addAction(const QString & text, const QObject * receiver,
?const char * member, const QKeySequence & shortcut = 0)
QAction* addAction(const QIcon & icon, const QString & text,?
const QObject * receiver, const char * member,?
const QKeySequence & shortcut = 0)

2、工具欄

直接調(diào)用QMainWindow類的addToolBar() 函數(shù)獲取主窗口的工具條對象,每增加一個(gè)工具條都需要調(diào)用一次該函數(shù)。

n 插入屬于工具條的動(dòng)作,即在工具條上添加操作。通過QToolBar類的addAction() 函數(shù)添加。

n 工具條是一個(gè)可移動(dòng)的窗口,它的停靠區(qū)域由QToolBar的allowAreas決定,包括:

/*
Qt::LeftToolBarArea?? ??? ?//停靠在左側(cè)
Qt::RightToolBarArea?? ??? ?//停靠在右側(cè)
Qt::TopToolBarArea?? ??? ?//停靠在頂部
Qt::BottomToolBarArea ? ?? ?//停靠在底部
Qt::AllToolBarAreas?? ??? ?//以上四個(gè)位置都可停靠
*/

/*使用setAllowedAreas()函數(shù)指定停靠區(qū)域*/
setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
/*使用setMoveable()函數(shù)設(shè)定工具欄的可移動(dòng)性*/
setMoveable(false);//工具條不可移動(dòng), 只能停靠在初始化的位置上


3、狀態(tài)欄

派生自QWidget類,使用方法與QWidget類似,QStatusBar類常用成員函數(shù):

//添加小部件
void addWidget(QWidget * widget, int stretch = 0)
//插入小部件
int?? ?insertWidget(int index, QWidget * widget, int stretch = 0)
//刪除小部件
void removeWidget(QWidget * widget)

4、對話框QDialog
Qt 中使用QDialog類實(shí)現(xiàn)對話框。

對話框分為模態(tài)對話框和非模態(tài)對話框。

模態(tài)對話框,就是會(huì)阻塞同一應(yīng)用程序中其它窗口的輸入。

模態(tài)對話框很常見,比如“打開文件”功能。你可以嘗試一下記事本的打開文件,當(dāng)打開文件對話框出現(xiàn)時(shí),我們是不能對除此對話框之外的窗口部分進(jìn)行操作的。

與此相反的是非模態(tài)對話框,例如查找對話框,我們可以在顯示著查找對話框的同時(shí),繼續(xù)對記事本的內(nèi)容進(jìn)行編輯。

1、標(biāo)準(zhǔn)對話框

Qt 的內(nèi)置對話框大致分為以下幾類:

QColorDialog: 選擇顏色;

QFileDialog: 選擇文件或者目錄;

QFontDialog: 選擇字體;

QInputDialog: 允許用戶輸入一個(gè)值,并將其值返回;

QMessageBox: 模態(tài)對話框,用于顯示信息、詢問問題等;

QPageSetupDialog: 為打印機(jī)提供紙張相關(guān)的選項(xiàng);

QPrintDialog: 打印機(jī)配置;

QPrintPreviewDialog:打印預(yù)覽;

QProgressDialog: 顯示操作過程。

2、自定義消息框

Qt 支持模態(tài)對話框和非模態(tài)對話框。

模態(tài)與非模態(tài)的實(shí)現(xiàn):

使用QDialog::exec()實(shí)現(xiàn)應(yīng)用程序級別的模態(tài)對話框

使用QDialog::open()實(shí)現(xiàn)窗口級別的模態(tài)對話框

使用QDialog::show()實(shí)現(xiàn)非模態(tài)對話框。

3、模態(tài)對話框

下面的示例中,我們調(diào)用了exec()將對話框顯示出來,因此這就是一個(gè)模態(tài)對話框。當(dāng)對話框出現(xiàn)時(shí),我們不能與主窗口進(jìn)行任何交互,直到我們關(guān)閉了該對話框。

void MainWindow::open()
{
? ? QDialog dialog;
? ? dialog.setWindowTitle(tr("Hello, dialog!"));
? ? dialog.exec();
}

4、非模態(tài)對話框

下面我們試著將exec()修改為show(),看看非模態(tài)對話框:

void MainWindow::open()
{
? ? QDialog dialog(this);
? ? dialog.setWindowTitle(tr("Hello, dialog!"));
? ? dialog.show();
}

是不是事與愿違?對話框竟然一閃而過!這是因?yàn)?#xff0c;**show()函數(shù)不會(huì)阻塞當(dāng)前線程,對話框會(huì)顯示出來,然后函數(shù)立即返回,代碼繼續(xù)執(zhí)行。**注意,dialog 是建立在棧上的,show()函數(shù)返回,MainWindow::open()函數(shù)結(jié)束,dialog 超出作用域被析構(gòu),因此對話框消失了。知道了原因就好改了,我們將 dialog 改成堆上建立,當(dāng)然就沒有這個(gè)問題了:

void MainWindow::open()
{
? ? QDialog *dialog = new QDialog;
? ? dialog->setWindowTitle(tr("Hello, dialog!"));
? ? dialog->show();
}

如果你足夠細(xì)心,應(yīng)該發(fā)現(xiàn)上面的代碼是有問題的:dialog 存在內(nèi)存泄露!dialog 使用 new 在堆上分配空間,卻一直沒有 delete。解決方案也很簡單:將 MainWindow 的指針賦給 dialog 即可。還記得我們前面說過的 Qt 的對象系統(tǒng)嗎?

不過,這樣做有一個(gè)問題:如果我們的對話框不是在一個(gè)界面類中出現(xiàn)呢?由于QWidget的 parent 必須是QWidget指針,那就限制了我們不能將一個(gè)普通的 C++ 類指針傳給 Qt 對話框。另外,如果對內(nèi)存占用有嚴(yán)格限制的話,當(dāng)我們將主窗口作為 parent 時(shí),主窗口不關(guān)閉,對話框就不會(huì)被銷毀,所以會(huì)一直占用內(nèi)存。在這種情景下,我們可以設(shè)置 dialog 的WindowAttribute:

void MainWindow::open()
{
? ? QDialog *dialog = new QDialog;
? ? dialog->setAttribute(Qt::WA_DeleteOnClose);
? ? dialog->setWindowTitle(tr("Hello, dialog!"));
? ? dialog->show();
}

setAttribute()函數(shù)設(shè)置對話框關(guān)閉時(shí),自動(dòng)銷毀對話框。

1、消息對話框

QMessageBox用于顯示消息提示。我們一般會(huì)使用其提供的幾個(gè) static 函數(shù):

顯示關(guān)于對話框。

void about(QWidget * parent, const QString & title, const QString & text)
1
這是一個(gè)最簡單的對話框,其標(biāo)題是 title,內(nèi)容是 text,父窗口是 parent。對話框只有一個(gè) OK 按鈕。

顯示關(guān)于 Qt 對話框。該對話框用于顯示有關(guān) Qt 的信息。

void aboutQt(QWidget * parent, const QString & title = QString())
1
顯示嚴(yán)重錯(cuò)誤對話框。

StandardButton critical(QWidget * parent,?
const QString & title,?
const QString & text,?
StandardButtons buttons = Ok,?
StandardButton defaultButton = NoButton)

這個(gè)對話框?qū)@示一個(gè)紅色的錯(cuò)誤符號。我們可以通過 buttons 參數(shù)指明其顯示的按鈕。默認(rèn)情況下只有一個(gè) Ok 按鈕,我們可以使用StandardButtons類型指定多種按鈕。

與QMessageBox::critical()類似,不同之處在于這個(gè)對話框提供一個(gè)普通信息圖標(biāo)。

StandardButton information(QWidget * parent,?
const QString & title,?
const QString & text,?
StandardButtons buttons = Ok,?
StandardButton defaultButton = NoButton)

與QMessageBox::critical()類似,不同之處在于這個(gè)對話框提供一個(gè)問號圖標(biāo),并且其顯示的按鈕是“是”和“否”。

StandardButton question(QWidget * parent,
const QString & title,?
const QString & text,?
StandardButtons buttons = StandardButtons( Yes | No ),?
StandardButton defaultButton = NoButton)

與QMessageBox::critical()類似,不同之處在于這個(gè)對話框提供一個(gè)黃色嘆號圖標(biāo)。

StandardButton warning(QWidget * parent,?
const QString & title,?
const QString & text,?
StandardButtons buttons = Ok,?
StandardButton defaultButton = NoButton)

2、標(biāo)準(zhǔn)文件對話框

QFileDialog,也就是文件對話框。

openAction = new QAction(QIcon(":/images/file-open"),
?tr("&Open..."), this);
openAction->setShortcuts(QKeySequence::Open);
openAction->setStatusTip(tr("Open an existing file"));

saveAction = new QAction(QIcon(":/images/file-save"),?
tr("&Save..."), this);
saveAction->setShortcuts(QKeySequence::Save);
saveAction->setStatusTip(tr("Save a new file"));

QMenu *file = menuBar()->addMenu(tr("&File"));
file->addAction(openAction);
file->addAction(saveAction);

QToolBar *toolBar = addToolBar(tr("&File"));
toolBar->addAction(openAction);
toolBar->addAction(saveAction);

textEdit = new QTextEdit(this);
setCentralWidget(textEdit);

使用connect()函數(shù),為這兩個(gè)QAction對象添加響應(yīng)的動(dòng)作:

connect(openAction, &QAction::triggered,?
this, &MainWindow::openFile);
connect(saveAction, &QAction::triggered,?
this, &MainWindow::saveFile);

下面是最主要的openFile()和saveFile()這兩個(gè)函數(shù)的代碼:

//打開文件
void MainWindow::openFile()
{
? ? QString path = QFileDialog::getOpenFileName(this,
? ? ? ? ? ? ? ?tr("Open File"), ".", tr("Text Files(*.txt)"));
? ? if(!path.isEmpty())?
{
? ? ? ? QFile file(path);
? ? ? ? if (!file.open(QIODevice::ReadOnly | QIODevice::Text))?
{
? ? ? ? ? ? QMessageBox::warning(this, tr("Read File"),
? ? ? ? ? ? ? ? ? ? ? ? ?tr("Cannot open file:\n%1").arg(path));
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? QTextStream in(&file);
? ? ? ? textEdit->setText(in.readAll());
? ? ? ? file.close();
? ? }?
else?
{
? ? ? ? QMessageBox::warning(this, tr("Path"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tr("You did not select any file."));
? ? ?}
}

//保存文件
void MainWindow::saveFile()
{
? ? QString path = QFileDialog::getSaveFileName(this,
? ? ? ? ? ? ? ?tr("Open File"), ".", tr("Text Files(*.txt)"));
? ? if(!path.isEmpty())?
{
? ? ? ? QFile file(path);
? ? ? ? if (!file.open(QIODevice::WriteOnly | QIODevice::Text))?
{
? ? ? ? ? ? QMessageBox::warning(this, tr("Write File"),
? ? ? ? ? ? ? ? ? ? ? ? ?tr("Cannot open file:\n%1").arg(path));
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? QTextStream out(&file);
? ? ? ? out << textEdit->toPlainText();
? ? ? ? file.close();
? ? }?
else?
{
? ? ? ? QMessageBox::warning(this, tr("Path"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tr("You did not select any file."));
? ? }
}

QFileDialog::getOpenFileName()來獲取需要打開的文件的路徑。這個(gè)函數(shù)原型如下:

QString getOpenFileName(QWidget * parent = 0,
? ? ? ? ? ? ? ? ? ? ? ? const QString & caption = QString(),
? ? ? ? ? ? ? ? ? ? ? ? const QString & dir = QString(),
? ? ? ? ? ? ? ? ? ? ? ? const QString & filter = QString(),
? ? ? ? ? ? ? ? ? ? ? ? QString * selectedFilter = 0,
? ? ? ? ? ? ? ? ? ? ? ? Options options = 0)

六個(gè)參數(shù)分別是:

parent:父窗口

caption:對話框標(biāo)題

dir:對話框打開時(shí)的默認(rèn)目錄

“.” 代表程序運(yùn)行目錄

“/” 代表當(dāng)前盤符的根目錄(特指 Windows 平臺(tái);Linux 平臺(tái)當(dāng)然就是根目錄),這個(gè)參數(shù)也可以是平臺(tái)相關(guān)的,比如“C:\”等

filter:過濾器。

我們使用文件對話框可以瀏覽很多類型的文件,但是,很多時(shí)候我們僅希望打開特定類型的文件

selectedFilter:默認(rèn)選擇的過濾器

options:對話框的一些參數(shù)設(shè)定

比如只顯示文件夾等等,它的取值是enum QFileDialog::Option,每個(gè)選項(xiàng)可以使用 | 運(yùn)算組合起來

四、布局管理器
Qt提供了兩種組件定位機(jī)制:絕對定位和布局定位。

絕對定位
絕對定位就是一種最原始的定位方法:給出這個(gè)組件的坐標(biāo)和長寬值。

如果用戶改變了窗口大小,比如點(diǎn)擊最大化按鈕或者使用鼠標(biāo)拖動(dòng)窗口邊緣,采用絕對定位的組件是不會(huì)有任何響應(yīng)的。

布局定位
只要把組件放入某一種布局,布局由專門的布局管理器進(jìn)行管理。當(dāng)需要調(diào)整大小或者位置的時(shí)候,Qt 使用對應(yīng)的布局管理器進(jìn)行調(diào)整。

Qt 提供的布局中以下三種是我們最常用的:

QHBoxLayout:按照水平方向從左到右布局;
QVBoxLayout:按照豎直方向從上到下布局;
QGridLayout:在一個(gè)網(wǎng)格中進(jìn)行布局,類似于 HTML 的 table;
自定義控件
UI的控件和自定義控件的父類(基類)要一樣

選中UI控件 -> 提升

五、消息機(jī)制和事件
事件
Qt 中所有事件類都繼承于QEvent

event()函數(shù)并不直接處理事件,而是按照事件對象的類型分派給特定的事件處理函數(shù)(event handler)

在所有組件的父類QWidget中,定義了很多事件處理的回調(diào)函數(shù),如:

keyPressEvent()

keyReleaseEvent()

mouseDoubleClickEvent()

mouseMoveEvent()

mousePressEvent()

mouseReleaseEvent() 等。

這些函數(shù)都是 protected virtual 的,也就是說我們可以在子類中重新實(shí)現(xiàn)這些函數(shù)。下面來看一個(gè)例子:

class EventLabel : public QLabel
{
protected:
? ? void mouseMoveEvent(QMouseEvent *event);
? ? void mousePressEvent(QMouseEvent *event);
? ? void mouseReleaseEvent(QMouseEvent *event);
};
?
void EventLabel::mouseMoveEvent(QMouseEvent *event)
{
this->setText(QString("<center><h1>Move: (%1, %2)
</h1></center>").arg(QString::number(event->x()),
? ? ? ? ? ? QString::number(event->y())));
}
?
void EventLabel::mousePressEvent(QMouseEvent *event)
{
? ? this->setText(QString("<center><h1>Press:(%1, %2)
</h1></center>").arg(QString::number(event->x()),
? ? ? ? ? ? ? ? QString::number(event->y())));
}
?
void EventLabel::mouseReleaseEvent(QMouseEvent *event)
{
? ? QString msg;
? ? msg.sprintf("<center><h1>Release: (%d, %d)</h1></center>",
? ? ? ? ? ? ? ? event->x(), event->y());
? ? this->setText(msg);
}
?
int main(int argc, char *argv[])
{
? ? QApplication a(argc, argv);
?
? ? EventLabel *label = new EventLabel;
? ? label->setWindowTitle("MouseEvent Demo");
? ? label->resize(300, 200);
? ? label->show();
?
? ? return a.exec();
}

EventLabel繼承了QLabel,重寫了mousePressEvent()、mouseMoveEvent()和MouseReleaseEvent()三個(gè)函數(shù)。在鼠標(biāo)按下(press)、鼠標(biāo)移動(dòng)(move)和鼠標(biāo)釋放(release)的時(shí)候,把當(dāng)前鼠標(biāo)的坐標(biāo)值顯示在這個(gè)Label上面。

運(yùn)行上面的代碼,當(dāng)我們點(diǎn)擊了一下鼠標(biāo)之后,label 上將顯示鼠標(biāo)當(dāng)前坐標(biāo)值。

為什么要點(diǎn)擊鼠標(biāo)之后才能在mouseMoveEvent()函數(shù)中顯示鼠標(biāo)坐標(biāo)值?

這是因?yàn)镼Widget中有一個(gè)mouseTracking屬性,該屬性用于設(shè)置是否追蹤鼠標(biāo)。只有鼠標(biāo)被追蹤時(shí),mouseMoveEvent()才會(huì)發(fā)出。如果mouseTracking是 false(默認(rèn)即是),組件在至少一次鼠標(biāo)點(diǎn)擊之后,才能夠被追蹤,也就是能夠發(fā)出mouseMoveEvent()事件。如果mouseTracking為 true,則mouseMoveEvent()直接可以被發(fā)出。

在構(gòu)造函數(shù)里面設(shè)置label->setMouseTracking(true);即可

event()
event()函數(shù)主要用于事件的分發(fā)

例如,我們希望在一個(gè)QWidget組件中監(jiān)聽 tab 鍵的按下,那么就可以繼承QWidget,并重寫它的event()函數(shù),來達(dá)到這個(gè)目的:

bool CustomWidget::event(QEvent *e)
{
? ? if (e->type() == QEvent::KeyPress) {
? ? ? ? QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
? ? ? ? if (keyEvent->key() == Qt::Key_Tab) {
? ? ? ? ? ? qDebug() << "You press tab.";
? ? ? ? ? ? return true;
? ? ? ? }
? ? }
? ? return QWidget::event(e);
}

CustomWidget是一個(gè)普通的QWidget子類。我們重寫了它的event()函數(shù),這個(gè)函數(shù)有一個(gè)QEvent對象作為參數(shù),也就是需要轉(zhuǎn)發(fā)的事件對象。函數(shù)返回值是 bool 類型:

如果傳入的事件已被識別并且處理,則需要返回 true,否則返回 false。如果返回值是 true,那么 Qt 會(huì)認(rèn)為這個(gè)事件已經(jīng)處理完畢,不會(huì)再將這個(gè)事件發(fā)送給其它對象,而是會(huì)繼續(xù)處理事件隊(duì)列中的下一事件
在event()函數(shù)中,調(diào)用事件對象的accept()和ignore()函數(shù)是沒有作用的,不會(huì)影響到事件的傳播
event()函數(shù)中實(shí)際是通過事件處理器來響應(yīng)一個(gè)具體的事件。這相當(dāng)于event()函數(shù)將具體事件的處理“委托”給具體的事件處理器。而這些事件處理器是 protected virtual 的,因此,我們重寫了某一個(gè)事件處理器,即可讓 Qt 調(diào)用我們自己實(shí)現(xiàn)的版本

事件過濾器
有時(shí)候,對象需要查看、甚至要攔截發(fā)送到另外對象的事件。

QObject有一個(gè)eventFilter()函數(shù),用于建立事件過濾器。函數(shù)原型如下:

virtual bool QObject::eventFilter ( QObject * watched, QEvent * event );
1
這個(gè)函數(shù)返回一個(gè) bool 類型,如果你想將參數(shù) event 過濾出來,比如,**不想讓它繼續(xù)轉(zhuǎn)發(fā),就返回 true,否則返回 false。**事件過濾器的調(diào)用時(shí)間是目標(biāo)對象(也就是參數(shù)里面的watched對象)接收到事件對象之前。也就是說,如果你在事件過濾器中停止了某個(gè)事件,那么,watched對象以及以后所有的事件過濾器根本不會(huì)知道這么一個(gè)事件。

上面QWidget組件中event()函數(shù)監(jiān)聽 tab 鍵的按下修改為使用事件過濾器的版本:

bool FilterObject::eventFilter(QObject *object, QEvent *event)
{
? ? if (object == target && event->type() == QEvent::KeyPress)?
{
? ? ? ? QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
? ? ? ? if (keyEvent->key() == Qt::Key_Tab) {
? ? ? ? ? ? qDebug() << "You press tab.";
? ? ? ? ? ? return true;
? ? ? ? } else {
? ? ? ? ? ? return false;
? ? ? ? }
? ? }
? ? return false;
}

注意:事件過濾器和被安裝過濾器的組件必須在同一線程,否則,過濾器將不起作用。另外,如果在安裝過濾器之后,這兩個(gè)組件到了不同的線程,那么,只有等到二者重新回到同一線程的時(shí)候過濾器才會(huì)有效。

總結(jié)
Qt 的事件處理,實(shí)際上是有五個(gè)層次:

重寫paintEvent()、mousePressEvent()等事件處理函數(shù)。這是最普通、最簡單的形式,同時(shí)功能也最簡單。
重寫event()函數(shù)。event()函數(shù)是所有對象的事件入口,QObject和QWidget中的實(shí)現(xiàn),默認(rèn)是把事件傳遞給特定的事件處理函數(shù)。
重寫event()函數(shù)。event()函數(shù)是所有對象的事件入口,QObject和QWidget中的實(shí)現(xiàn),默認(rèn)是把事件傳遞給特定的事件處理函數(shù)。
在QCoreApplication::instance()上面安裝事件過濾器。該過濾器將過濾所有對象的所有事件,因此和notify()函數(shù)一樣強(qiáng)大,但是它更靈活,因?yàn)榭梢园惭b多個(gè)過濾器。全局的事件過濾器可以看到 disabled 組件上面發(fā)出的鼠標(biāo)事件。全局過濾器有一個(gè)問題:只能用在主線程。
重寫QCoreApplication::notify()函數(shù)。這是最強(qiáng)大的,和全局事件過濾器一樣提供完全控制,并且不受線程的限制。但是全局范圍內(nèi)只能有一個(gè)被使用(因?yàn)镼CoreApplication是單例的)。
六、繪圖和繪圖設(shè)備
QPainter
QPainter用來執(zhí)行繪制的操作;QPaintDevice是一個(gè)二維空間的抽象,QPaintEngine提供了畫筆(QPainter)在不同的設(shè)備上進(jìn)行繪制的統(tǒng)一的接口

上面的示意圖告訴我們,Qt 的繪圖系統(tǒng)實(shí)際上是,使用QPainter在QPainterDevice上進(jìn)行繪制,它們之間使用QPaintEngine進(jìn)行通訊(也就是翻譯QPainter的指令)。

下面我們通過一個(gè)實(shí)例來介紹QPainter的使用:

class PaintedWidget : public QWidget
{
? ? Q_OBJECT
public:
? ? PaintedWidget(QWidget *parent = 0);
protected:
? ? void paintEvent(QPaintEvent *);
}

注意我們重寫了QWidget的paintEvent()函數(shù)。接下來就是PaintedWidget的源代碼:

PaintedWidget::PaintedWidget(QWidget *parent) :
? ? QWidget(parent)
{
? ? resize(800, 600);
? ? setWindowTitle(tr("Paint Demo"));
}

void PaintedWidget::paintEvent(QPaintEvent *)
{
? ? QPainter painter(this);
? ? painter.drawLine(80, 100, 650, 500);
? ? painter.setPen(Qt::red);
? ? painter.drawRect(10, 10, 100, 400);
? ? painter.setPen(QPen(Qt::green, 5));
? ? painter.setBrush(Qt::blue);
? ? painter.drawEllipse(50, 150, 400, 200);
}

構(gòu)造函數(shù)中,我們僅僅設(shè)置了窗口的大小和標(biāo)題。而paintEvent()函數(shù)則是繪制的代碼。

繪圖設(shè)備
繪圖設(shè)備是指繼承QPainterDevice的子類。

QBitmap是QPixmap的一個(gè)子類,它的色深限定為1,可以使用 QPixmap的isQBitmap()函數(shù)來確定這個(gè)QPixmap是不是一個(gè)QBitmap。

QPixmap:和平臺(tái)無關(guān),針對屏幕進(jìn)行了優(yōu)化了,不能對圖片進(jìn)行修改

QImage:和平臺(tái)無關(guān),在線程中繪圖,可以對圖片進(jìn)行優(yōu)化

QPicture:保存繪圖的狀態(tài)(二進(jìn)制文件)

1、QPixmap -> QImage

QPixmap a;

a.toImage();

2、QImage -> QPixmap

QImage b;

QPixmap::fromImage(b);

3、QPainter

QPainter p;

QPicture pic;

p.begin(&pic);

//繪圖動(dòng)作

p.end();

pic.save("路徑");

4、加載圖片

QPicture temp;

temp.load("路徑");

不規(guī)則窗口
1、給窗口畫一張背景圖

2、去表框

3、設(shè)定屬性(背景透明)

4、移動(dòng)坐標(biāo)是相對于屏幕而言

七、文件系統(tǒng)
I/O 設(shè)備的類圖(Qt5):


QIODevice:所有 I/O 設(shè)備類的父類,提供了字節(jié)塊讀寫的通用操作以及基本接口;
QFileDevice:Qt5新增加的類,提供了有關(guān)文件操作的通用實(shí)現(xiàn)。
QFlie:訪問本地文件或者嵌入資源;
QTemporaryFile:創(chuàng)建和訪問本地文件系統(tǒng)的臨時(shí)文件;
QBuffer:讀寫QbyteArray, 內(nèi)存文件;
QProcess:運(yùn)行外部程序,處理進(jìn)程間通訊;
QAbstractSocket:所有套接字類的父類;
QTcpSocket:TCP協(xié)議網(wǎng)絡(luò)數(shù)據(jù)傳輸;
QUdpSocket:傳輸 UDP 報(bào)文;
QSslSocket:使用 SSL/TLS 傳輸數(shù)據(jù);
QFile提供了從文件中讀取和寫入數(shù)據(jù)的能力。

我們通常會(huì)將文件路徑作為參數(shù)傳給QFile的構(gòu)造函數(shù)。不過也可以在創(chuàng)建好對象最后,使用setFileName()來修改

**我們可以使用QDataStream或QTextStream類來讀寫文件,也可以使用QIODevice類提供的read()、readLine()、readAll()以及write()這樣的函數(shù)。**值得注意的是,有關(guān)文件本身的信息,比如文件名、文件所在目錄的名字等,則是通過QFileInfo獲取。

QFileInfo有很多類型的函數(shù),舉一些常用例子。比如:

isDir()檢查該文件是否是目錄;
isExecutable() 檢查該文件是否是可執(zhí)行文件等。
baseName() 可以直接獲得文件名;
completeBaseName() 獲取完整的文件名
suffix() 則直接獲取文件后綴名。
completeSuffix() 獲取完整的文件后綴
文件
1、QFile file;

file.setFileName();

file.open();

file.write();

file.read();

file.close();

2、QFileInfo info;

info.size();

info.fileName();

QDataStream:二進(jìn)制方式

QTextStream:文本方式(指定編碼)

QBuffer:內(nèi)存文件(內(nèi)容放在內(nèi)存)

八、Socket通信
Qt中提供的所有的Socket類都是非阻塞的。

Qt中常用的用于socket通信的套接字類:

QTcpServer 用于TCP通信, 作為服務(wù)器端套接字使用

QTcpSocket 用于TCP通信,作為客戶端套接字使用。

QUdpSocket 用于UDP通信,服務(wù)器,客戶端均使用此套接字。

TCP
在Qt中實(shí)現(xiàn)TCP服務(wù)器端通信的流程:

創(chuàng)建套接字

將套接字設(shè)置為監(jiān)聽模式

等待并接受客戶端請求

可以通過QTcpServer提供的void newConnection()****信號來檢測是否有連接請求,如果有可以在對應(yīng)的槽函數(shù)中調(diào)用nextPendingConnection函數(shù)獲取到客戶端的Socket信息(返回值為QTcpSocket*類型指針),通過此套接字與客戶端之間進(jìn)行通信。

接收或者向客戶端發(fā)送數(shù)據(jù)

接收數(shù)據(jù):使用read()或者readAll()函數(shù)

發(fā)送數(shù)據(jù):使用write()函數(shù)

在Qt中實(shí)現(xiàn)TCP/IP客戶端通信的流程:

創(chuàng)建套接字

連接服務(wù)器

可以使用QTcpSocket類的**connectToHost()**函數(shù)來連接服務(wù)器。

向服務(wù)器發(fā)送或者接受數(shù)據(jù)

下面例子為簡單的TCP/IP通信的實(shí)現(xiàn)例子:

TCP服務(wù)端
//---------- tcpserver.h ------------
class TCPServer : public QMainWindow
{
? ? Q_OBJECT

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

public slots:
? ? void slotNewConnection();
? ? void slotReadyRead();

private:
? ? Ui::TCPServer *ui;
? ? // 負(fù)責(zé)監(jiān)聽的套接字
? ? QTcpServer* m_server;
? ? // 負(fù)責(zé)通信的套接字
? ? QTcpSocket* m_client;
};

//---------- tcpserver.cpp ------------
TCPServer::TCPServer(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::TCPServer),
? ? m_server(NULL),
? ? m_client(NULL)
{
? ? ui->setupUi(this);

? ? //創(chuàng)建套接字對象
? ? m_server = new QTcpServer(this);
? ? //將套接字設(shè)置為監(jiān)聽模式
? ? m_server->listen(QHostAddress::Any, 9999);

? ? //通過信號接收客戶端請求
? ? connect(m_server, &QTcpServer::newConnection,?
this, &TCPServer::slotNewConnection);
}

TCPServer::~TCPServer()
{
? ? delete ui;
}

void TCPServer::slotNewConnection()
{
? ? if(m_client == NULL)
? ? {
? ? ? ? //處理客戶端的連接請求
? ? ? ? m_client = m_server->nextPendingConnection();
? ? ? ? //發(fā)送數(shù)據(jù)
? ? ? ? m_client->write("服務(wù)器連接成功!!!");
? ? ? ? //連接信號, 接收客戶端數(shù)據(jù)
? ? ? ? connect(m_client, &QTcpSocket::readyRead,?
this, &TCPServer::slotReadyRead);
? ? }
}

void TCPServer::slotReadyRead()
{
? ? //接收數(shù)據(jù)
? ? QByteArray array = m_client->readAll();
? ? QMessageBox::information(this, "Client Message", array);
}

TCP客戶端
//------------- tcpclient.h ------------
class TCPClient : public QMainWindow
{
? ? Q_OBJECT

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

public slots:
? ? void slotReadyRead();
? ? void slotSendMsg();

private:
? ? Ui::TCPClient *ui;
? ? QTcpSocket* m_client;
};

//------------- tcpclient.cpp --------------
TCPClient::TCPClient(QWidget *parent) :
? ? QMainWindow(parent),
? ? ui(new Ui::TCPClient)
{
? ? ui->setupUi(this);
? ? //創(chuàng)建套接字
? ? m_client = new QTcpSocket(this);
? ? //連接服務(wù)器
? ? m_client->connectToHost(QHostAddress("127.0.0.1"), 9999);

? ? //通過信號接收服務(wù)器數(shù)據(jù)
? ? connect(m_client, &QTcpSocket::readyRead,?
this, &TCPClient::slotReadyRead);
? ? //發(fā)送按鈕
? ? connect(ui->btnSend, &QPushButton::clicked,?
this, &TCPClient::slotSendMsg);
}

TCPClient::~TCPClient()
{
? ? delete ui;
}

void TCPClient::slotReadyRead()
{
?? ? //接收數(shù)據(jù)
? ? QByteArray array = m_client->readAll();
? ? QMessageBox::information(this, "Server Message", array);
}

void TCPClient::slotSendMsg()
{
? ? QString text = ui->textEdit->toPlainText();
?? ? //發(fā)送數(shù)據(jù)
? ? m_client->write(text.toUtf8());
? ? ui->textEdit->clear();
}

UDP
在UDP方式下,客戶端并不與服務(wù)器建立連接,它只負(fù)責(zé)調(diào)用發(fā)送函數(shù)向服務(wù)器發(fā)送數(shù)據(jù)。類似的服務(wù)器也不從客戶端接收連接,只負(fù)責(zé)調(diào)用接收函數(shù),等待來自客戶端的數(shù)據(jù)的到達(dá)。

在UDP通信中,服務(wù)器端和客戶端的概念已經(jīng)顯得有些淡化,兩部分做的工作都大致相同:

創(chuàng)建套接字

綁定套接字

在UDP中如果需要接收數(shù)據(jù)則需要對套接字進(jìn)行綁定,只發(fā)送數(shù)據(jù)則不需要對套接字進(jìn)行綁定。

通過調(diào)用bind()函數(shù)將套接字綁定到指定端口上。

接收或者發(fā)送數(shù)據(jù)

接收數(shù)據(jù):使用readDatagram()接收數(shù)據(jù),函數(shù)聲明如下:
qint64 readDatagram(char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0)
1
? 參數(shù):

data: 接收數(shù)據(jù)的緩存地址

maxSize: 緩存接收的最大字節(jié)數(shù)

address: 數(shù)據(jù)發(fā)送方的地址(一般使用提供的默認(rèn)值)

port: 數(shù)據(jù)發(fā)送方的端口號(一般使用提供的默認(rèn)值)

使用pendingDatagramSize()可以獲取到將要接收的數(shù)據(jù)的大小,根據(jù)該函數(shù)返回值來準(zhǔn)備對應(yīng)大小的內(nèi)存空間存放將要接收的數(shù)據(jù)。

發(fā)送數(shù)據(jù): 使用writeDatagram()函數(shù)發(fā)送數(shù)據(jù),函數(shù)聲明如下:
qint64 writeDatagram(const QByteArray & datagram, const QHostAddress & host, quint16 port)
1
? 參數(shù):

datagram:要發(fā)送的字符串

host:數(shù)據(jù)接收方的地址

port:數(shù)據(jù)接收方的端口號

廣播
在使用QUdpSocket類的writeDatagram()函數(shù)發(fā)送數(shù)據(jù)的時(shí)候,其中第二個(gè)參數(shù)host應(yīng)該指定為廣播地址:QHostAddress::Broadcast此設(shè)置相當(dāng)于QHostAddress(“255.255.255.255”)

使用UDP廣播的的特點(diǎn):

使用UDP進(jìn)行廣播,局域網(wǎng)內(nèi)的其他的UDP用戶全部可以收到廣播的消息

UDP廣播只能在局域網(wǎng)范圍內(nèi)使用

組播
在使用QUdpSocket類的writeDatagram()函數(shù)發(fā)送數(shù)據(jù)的時(shí)候,其中第二個(gè)參數(shù)host應(yīng)該指定為組播地址,關(guān)于組播地址的分類:

224.0.0.0~224.0.0.255為預(yù)留的組播地址(永久組地址),地址224.0.0.0保留不做分配,其它地址供路由協(xié)議使用;

224.0.1.0~224.0.1.255是公用組播地址,可以用于Internet;

224.0.2.0~238.255.255.255為用戶可用的組播地址(臨時(shí)組地址),全網(wǎng)范圍內(nèi)有效;

239.0.0.0~239.255.255.255為本地管理組播地址,僅在特定的本地范圍內(nèi)有效。

注冊加入到組播地址需要使用QUdpSocket類的成員函數(shù):

bool joinMulticastGroup(const QHostAddress & groupAddress)

TCP 和 UDP的區(qū)別
TCP?? ?UDP
是否連接?? ?面向連接?? ?無連接
傳輸方式?? ?基于流?? ?基于數(shù)據(jù)報(bào)
傳輸可靠性?? ?可靠?? ?不可靠
傳輸效率?? ?效率低?? ?效率高
能否廣播?? ?不能?? ?能
九、多線程的使用
在次線程中處理的業(yè)務(wù)放在獨(dú)立的模塊(類)中,由主線程創(chuàng)建完該對象后,將其移交給指定的線程,且可以將多個(gè)類似的對象移交給同一個(gè)線程。

例子中,信號由主線程的QTimer對象發(fā)出,之后Qt會(huì)將關(guān)聯(lián)的事件放到worker所屬線程的事件隊(duì)列。由于隊(duì)列連接的作用,在不同線程間連接信號和槽是很安全的。

示例代碼如下:

class Worker : public QObject
{
? ? Q_OBJECT
private slots:
? ? void onTimeout()
? ? {
? ? ? ? qDebug()<<"Worker::onTimeout get called from?: "
<<QThread::currentThreadId();
? ? }
};
? ??
int main(int argc, char *argv[])
{
? ? QApplication a(argc, argv);
? ? qDebug()<<"From main thread: "<<QThread::currentThreadId();
??
? ? QThread t;
? ? QTimer timer;
? ? Worker worker;
??
? ? QObject::connect(&timer, SIGNAL(timeout()),?
&worker, SLOT(onTimeout()));
?? ??? ? // 啟動(dòng)定時(shí)器
? ? timer.start(1000);
? ?? ? // 將類對象移交個(gè)線程
? ? worker.moveToThread(&t);
? ? // 啟動(dòng)線程
? ? t.start();
??
? ? return a.exec();
}

關(guān)于Qobject類的connect函數(shù)最后一個(gè)參數(shù),連接類型:

自動(dòng)連接(AutoConnection),默認(rèn)的連接方式。
如果信號與槽,也就是發(fā)送者與接受者在同一線程,等同于直接連接;

如果發(fā)送者與接受者處在不同線程,等同于隊(duì)列連接。

直接連接(DirectConnection)
當(dāng)信號發(fā)射時(shí),槽函數(shù)立即直接調(diào)用。無論槽函數(shù)所屬對象在哪個(gè)線程,槽函數(shù)總在發(fā)送者所在線程執(zhí)行。

隊(duì)列連接(QueuedConnection)
當(dāng)控制權(quán)回到接受者所在線程的事件循環(huán)時(shí),槽函數(shù)被調(diào)用。槽函數(shù)在接受者所在線程執(zhí)行。

總結(jié):

* 隊(duì)列連接:槽函數(shù)在接受者所在線程執(zhí)行。

* 直接連接:槽函數(shù)在發(fā)送者所在線程執(zhí)行。

*自動(dòng)連接:二者不在同一線程時(shí),等同于隊(duì)列連接

多線程使用過程中注意事項(xiàng):

線程不能操作UI對象(從Qwidget直接或間接派生的窗口對象)

需要移動(dòng)到子線程中處理的模塊類,創(chuàng)建的對象的時(shí)候不能指定父對象。

十、Qt數(shù)據(jù)庫操作
一、操作數(shù)據(jù)庫
Qt 提供了 QtSql 模塊來提供平臺(tái)獨(dú)立的基于 SQL 的數(shù)據(jù)庫操作。

Qt 使用QSqlDatabase表示一個(gè)數(shù)據(jù)庫連接。

可以通過:

//打印Qt支持的數(shù)據(jù)庫驅(qū)動(dòng)
qDebug() << QSqlDatabase::drivers();
1
2
找到系統(tǒng)中所有可用的數(shù)據(jù)庫驅(qū)動(dòng)的名字列表。

封裝一個(gè)連接數(shù)據(jù)庫的函數(shù):

bool connect(const QString &dbName)
{
? ? QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// ? ?db.setHostName("host");
// ? ?db.setDatabaseName("dbname");
// ? ?db.setUserName("username");
// ? ?db.setPassword("password");
? ? db.setDatabaseName(dbName);
? ? if (!db.open()) {
? ? ? ? QMessageBox::critical(0, QObject::tr("Database Error"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? db.lastError().text());
? ? ? ? return false;
? ? }
? ? return true;
}

創(chuàng)建數(shù)據(jù)庫表student后,插入數(shù)據(jù),然后將其獨(dú)取出來:

if (connect("demo.db"))?
{
? ? QSqlQuery query;
? ? query.prepare("INSERT INTO student (name, age) VALUES (?, ?)");
? ? QVariantList names;
? ? names << "Tom" << "Jack" << "Jane" << "Jerry";
? ? query.addBindValue(names);
? ? QVariantList ages;
? ? ages << 20 << 23 << 22 << 25;
? ? query.addBindValue(ages);
? ? if (!query.execBatch()) {
? ? ? ? QMessageBox::critical(0, QObject::tr("Database Error"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? query.lastError().text());
? ? }
?
? ? query.exec("SELECT name, age FROM student");
? ? while (query.next()) {
? ? ? ? QString name = query.value(0).toString();
? ? ? ? int age = query.value(1).toInt();
? ? ? ? qDebug() << name << ": " << age;
? ? }
}?
else?
{
? ? return 1;
}

插入多條數(shù)據(jù),此時(shí)可以使用QSqlQuery::exec()函數(shù)一條一條插入數(shù)據(jù),但是這里我們選擇了另外一種方法:批量執(zhí)行。首先,我們使用QSqlQuery::prepare()函數(shù)對這條 SQL 語句進(jìn)行預(yù)處理,問號 ? 相當(dāng)于占位符,預(yù)示著以后我們可以使用實(shí)際數(shù)據(jù)替換這些位置。

在上面的代碼中,我們使用一個(gè)字符串列表 names 替換掉第一個(gè)問號的位置,一個(gè)整型列表 ages 替換掉第二個(gè)問號的位置,利用QSqlQuery::addBindValue()我們將實(shí)際數(shù)據(jù)綁定到這個(gè)預(yù)處理的 SQL 語句上。需要注意的是,names 和 ages 這兩個(gè)列表里面的數(shù)據(jù)需要一一對應(yīng)。然后我們調(diào)用**QSqlQuery::execBatch()批量執(zhí)行 SQL,之后結(jié)束該對象。**這樣,插入操作便完成了。

二、使用模型操作數(shù)據(jù)庫
基于QSqlTableModel 的模型處理更為高級,如果對 SQL 語句不熟悉,并且不需要很多復(fù)雜的查詢,這種QSqlTableModel模型基本可以滿足一般的需求。

1、查詢操作
if (connect("demo.db"))?
{
? ? QSqlTableModel model;
? ? model.setTable("student");
? ? model.setFilter("age > 20 and age < 25");
? ? if (model.select()) {
? ? ? ? for (int i = 0; i < model.rowCount(); ++i) {
? ? ? ? ? ? QSqlRecord record = model.record(i);
? ? ? ? ? ? QString name = record.value("name").toString();
? ? ? ? ? ? int age = record.value("age").toInt();
? ? ? ? ? ? qDebug() << name << ": " << age;
? ? ? ? }
? ? }
}?
else?
{
? ? return 1;
}

setTable()函數(shù)設(shè)置所需要操作的表格;

setFilter()函數(shù)則是添加過濾器,也就是 WHERE 語句所需要的部分。

例如上面代碼中的操作實(shí)際相當(dāng)于 SQL 語句:

SELECT * FROM student WHERE age > 20 and age < 25
1
注意:我們使用QSqlTableModel只能進(jìn)行 SELECT * 的查詢,不能只查詢其中某些列的數(shù)據(jù)。

2、插入操作
QSqlTableModel model;
model.setTable("student");
int row = 0;
model.insertRows(row, 1);
model.setData(model.index(row, 1), "Cheng");
model.setData(model.index(row, 2), 24);
model.submitAll();

model.insertRows(row, 1);說明我們想在索引 0 的位置插入 1 行新的數(shù)據(jù)。使用setData()函數(shù)則開始準(zhǔn)備實(shí)際需要插入的數(shù)據(jù)。最后,調(diào)用submitAll()函數(shù)提交所有修改。

例如上面代碼中的操作實(shí)際相當(dāng)于 SQL 語句:

INSERT INTO student (name, age) VALUES ('Cheng', 24)
1
3、更新操作
QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
? ? if (model.rowCount() == 1) {
? ? ? ? QSqlRecord record = model.record(0);
? ? ? ? record.setValue("age", 26);
? ? ? ? model.setRecord(0, record);
? ? ? ? model.submitAll();
? ? }
}

找到 age = 25 的記錄,然后將 age 重新設(shè)置為 26,存入相同的位置(在這里都是索引 0 的位置),提交之后完成一次更新

例如上面代碼中的操作實(shí)際相當(dāng)于 SQL 語句:

UPDATE student SET age = 26 WHERE age = 25
1
4、刪除操作
QSqlTableModel model;
model.setTable("student");
model.setFilter("age = 25");
if (model.select()) {
? ? if (model.rowCount() == 1) {
? ? ? ? model.removeRows(0, 1);
? ? ? ? model.submitAll();
? ? }
}

removeRows()函數(shù)可以一次刪除多行。

例如上面代碼中的操作實(shí)際相當(dāng)于 SQL 語句:

DELETE FROM student WHERE age = 25
1
如果你覺得文章還不錯(cuò),記得"點(diǎn)贊關(guān)注"

關(guān)注我的微信公眾號【 加班猿 】可以獲取更多內(nèi)容


————————————————
版權(quán)聲明:本文為CSDN博主「加班猿」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_37824357/article/details/109341717

總結(jié)

以上是生活随笔為你收集整理的Qt笔记总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

国产中的精品av小宝探花 | 91成人短视频在线观看 | 日韩免费电影在线观看 | 国产香蕉视频在线观看 | 国产成人一二片 | 国产一级免费观看 | 午夜色性片 | 最近日本韩国中文字幕 | 色资源中文字幕 | 99精品免费| 99精品在线视频观看 | 免费国产ww | 亚洲资源片| 夜夜骑天天操 | 国产人成精品一区二区三 | 色婷婷综合久久久久中文字幕1 | 91av短视频 | 国产精品久久久免费 | 中文字幕 国产精品 | 黄色av成人在线观看 | 在线免费视频 你懂得 | 91最新视频 | 狠狠操影视 | 正在播放一区二区 | 91av电影网 | 午夜精品一区二区三区在线播放 | 午夜精品在线看 | 久久精品xxx| 97超碰资源网 | 99色免费| 免费av在| 婷婷丁香激情 | 在线观看小视频 | 久热电影 | 手机在线看片日韩 | 欧美国产视频在线 | 高清日韩一区二区 | 久久婷婷国产 | 2020天天干夜夜爽 | 丁香五婷| 夜夜骑日日操 | 亚洲欧美视屏 | 国产精品一区二区三区免费视频 | 日韩影视在线观看 | 亚洲国产合集 | 久久理论片 | av高清影院 | 国产亚洲激情视频在线 | 日韩av线观看 | 日韩在线网址 | 色射爱 | www.国产精品 | 久久久久久久久亚洲精品 | 亚洲天堂社区 | 亚洲综合色av | 欧美伦理电影一区二区 | 中文字幕色在线视频 | 欧美亚洲成人xxx | 久久福利精品 | 日日爽视频 | 一区二区三区在线免费 | 韩国av免费看 | 深夜免费福利在线 | 91麻豆国产 | 人人干人人模 | 五月天六月婷 | 国产免费xvideos视频入口 | 中国一级片在线观看 | 免费视频资源 | 99视频99 | 久久免费在线视频 | 在线观看国产麻豆 | 中文字幕免费一区 | 国产精品久久久久久久久久了 | 成人国产在线 | 91精品国产麻豆国产自产影视 | 午夜男人影院 | 国产精品永久久久久久久www | 日日夜夜天天综合 | 久久人人添人人爽添人人88v | 日韩xxx视频| 日韩精品在线视频免费观看 | 日韩视频免费在线观看 | 青春草视频在线播放 | 亚洲精品字幕在线观看 | 日韩欧美一区二区三区视频 | 欧美一级小视频 | 久一久久| av在线免费观看黄 | 婷婷网址 | 成人av网站在线观看 | 在线免费中文字幕 | www,黄视频| 精品久久久成人 | 欧美午夜视频在线 | www亚洲精品 | 欧美日韩在线播放 | 中文乱幕日产无线码1区 | 国产成人精品一区二区三区在线 | 中文字幕成人在线 | 欧美视频99 | 欧美污在线观看 | 欧美淫视频 | 婷婷六月丁香激情 | 国内精品久久久久久久久久久久 | 免费国产一区二区 | 久久精品久久综合 | 中文在线字幕免费观 | 国内外激情视频 | 欧美日韩一区二区在线观看 | 中文字幕电影网 | 亚洲最大的av网站 | 欧美性色19p| 999精品| 国产99久 | 亚洲va韩国va欧美va精四季 | 麻豆久久一区二区 | 亚洲国产免费网站 | 五月天久久久久 | 天天爽人人爽夜夜爽 | 麻豆精品91| 一本色道久久精品 | 丁香六月久久综合狠狠色 | 999久久久免费精品国产 | 久久99国产视频 | 在线观看91视频 | 国产高清视频免费最新在线 | 亚洲精品乱码久久久久v最新版 | 成人在线观看影院 | 久久九九网站 | 久久一区国产 | 国产精品久久免费看 | 日韩无在线 | 婷婷六月综合亚洲 | 久久国产精品一区二区三区四区 | 免费av在| 国产免费人人看 | 午夜av不卡 | 午夜日b视频 | 国产尤物一区二区三区 | 99久久精品免费 | 奇米影视999 | 中文字幕乱码电影 | 婷婷在线资源 | 黄av资源 | 草久中文字幕 | 九色一区二区 | 黄色国产在线 | 日韩欧美第二页 | 日韩天天干| 久久免费99 | 日韩在线视频播放 | 毛片在线网 | 中文字幕第一页在线vr | 欧美日韩调教 | 日韩精品久久一区二区 | 97超碰人人澡人人爱 | 国产剧情一区在线 | 亚洲欧美成人在线 | 欧美a级在线免费观看 | 综合久久2023| av福利在线免费观看 | 中文字幕 成人 | 午夜999| 日韩av不卡在线 | 91成人亚洲| 天天射综合| 18性欧美xxxⅹ性满足 | 97视频在线看 | 国产99久久久国产精品成人免费 | 中国黄色一级大片 | 成人毛片一区二区三区 | 99热精品在线 | av丝袜在线 | 国产精品wwwwww | 综合亚洲视频 | 97成人精品视频在线观看 | 极品久久久 | 九九久久久久久久久激情 | 欧美人操人 | 亚洲欧洲在线视频 | 美女网站在线观看 | 天天摸夜夜操 | 黄色午夜 | 国产精品女人久久久 | 日韩特黄一级欧美毛片特黄 | 91一区二区三区久久久久国产乱 | 天天综合网天天 | 免费在线h| 亚洲区视频在线 | 天天搞天天干天天色 | 久久精品精品电影网 | 国产亚洲免费观看 | 97天堂 | 天天操天天干天天 | 日韩免费二区 | 久久夜色精品国产欧美一区麻豆 | 亚洲经典视频在线观看 | 欧美一级久久 | 欧美国产高清 | 91精品国产99久久久久 | 1024在线看片 | 成人av中文字幕在线观看 | 成人亚洲精品国产www | 夜夜澡人模人人添人人看 | 亚洲尺码电影av久久 | 精品国精品自拍自在线 | 精品日本视频 | 国产香蕉视频在线观看 | 一区二区三区福利 | 97av视频| 亚洲第一区在线播放 | 人人涩 | 中文字幕免费国产精品 | 欧美a在线免费观看 | 日本黄色大片儿 | 久久久网址 | 香蕉视频色 | 97成人在线视频 | 天天干天天搞天天射 | 精品国产电影 | av久久久久久 | 亚洲精品www| av在线免费网 | 久久视了 | av怡红院 | 久久国产午夜精品理论片最新版本 | 色久av | 日韩综合在线观看 | 91在线你懂的 | 激情欧美一区二区三区 | 最近中文字幕视频网 | av品善网| 99精品一区二区三区 | 国产一级免费视频 | 成人av在线一区二区 | 伊人永久 | 91麻豆精品国产91久久久无限制版 | 97在线观看免费高清完整版在线观看 | 久久好看 | 国产精品久久99综合免费观看尤物 | 99操视频| 伊人狠狠色丁香婷婷综合 | 六月丁香婷婷久久 | 中文字幕一区二区三区久久 | 在线亚洲精品 | 国产成人av网 | 99这里有精品 | 丰满少妇在线观看网站 | 国产精品久久久久9999 | 人人干人人做 | 亚洲首页| 久久精品国产精品亚洲精品 | 亚洲精品久久久久中文字幕二区 | 国产精彩视频一区二区 | 国产精品麻 | 国产在线1区| 国产午夜一级毛片 | 日韩一级黄色片 | 黄色av观看| 久久婷婷国产色一区二区三区 | 国产亚洲精品日韩在线tv黄 | 亚洲一区二区三区精品在线观看 | 国内精品久久久久久久久 | 国产玖玖视频 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 久久久久久久久毛片精品 | 日韩久久激情 | 中文字幕在线观看一区 | 丁香婷婷在线观看 | 欧美午夜精品久久久久久浪潮 | 欧美日韩亚洲第一 | 国产一区高清在线观看 | 亚洲国产播放 | 国产精品一区二区三区久久 | 成人国产精品 | 人人爽人人爽人人片 | www国产亚洲 | a级片网站 | 亚洲精品欧美精品 | 色黄www小说 | 国产黄在线看 | 天天干天天做天天爱 | 综合久久久久久久久 | 欧美激情视频一区二区三区免费 | 日本视频久久久 | 免费a视频在线观看 | 香蕉视频18| 日韩精品一区二区三区免费视频观看 | 国产福利一区二区三区在线观看 | 亚洲成av人片在线观看www | 日日夜夜婷婷 | 最新av网址在线观看 | 99精品视频在线观看视频 | av福利在线免费观看 | 国产一级在线观看 | 一区二三国产 | 久久av中文字幕片 | 国产黄色av | 国产黄在线播放 | 久草综合在线 | 亚洲欧洲成人精品av97 | av天天澡天天爽天天av | 久久久久蜜桃 | 中文字幕在线观看播放 | 久草网站在线 | 色噜噜在线观看 | 欧美另类tv | 久久久精品欧美一区二区免费 | 色噜噜日韩精品一区二区三区视频 | 日韩一区精品 | 欧美精品久久人人躁人人爽 | 探花视频在线观看+在线播放 | 97色涩 | 欧美日韩国产精品一区二区 | 超碰成人免费电影 | 久久精品影片 | 亚洲第五色综合网 | 日韩精品一区二区三区第95 | 久久99久久99| 国产精品美女毛片真酒店 | 国产午夜免费视频 | 狠狠狠狠狠干 | 欧美精品中文在线免费观看 | 成人一级| 免费在线激情电影 | 久久精品中文视频 | 97在线观看免费观看高清 | 日日夜夜艹 | 国内精品久久久久久久97牛牛 | 国产精品99爱 | 91精品1区 | 中中文字幕av | 天天操网站 | 日韩成人邪恶影片 | 亚洲国产一区av | www.黄色网.com | 99视频偷窥在线精品国自产拍 | 国产精品一区二 | 亚洲性xxxx| 久久久久久精 | 干 操 插| 婷婷日日| 在线观看免费视频 | 免费黄色在线播放 | 一区中文字幕 | 国产在线国产 | 在线视频欧美日韩 | 国产午夜激情视频 | 日韩在线精品 | 国产精品欧美在线 | av免费电影网站 | 天堂在线成人 | 不卡av在线免费观看 | 欧美色图东方 | 日韩欧美一区二区三区免费观看 | 国产成人精品999 | 天天干天天射天天操 | 久久精品91久久久久久再现 | 精品国产理论片 | 久久精品日产第一区二区三区乱码 | 亚洲少妇自拍 | 免费在线观看成人av | 亚洲成熟女人毛片在线 | 中文字幕精品www乱入免费视频 | 久久久精品免费观看 | 久久久 激情 | 欧美另类交在线观看 | 麻豆一级视频 | 欧美日韩在线第一页 | 国产精品精品国产 | 最近中文字幕高清字幕免费mv | 婷婷免费视频 | 91视频在线免费下载 | 午夜10000| 亚洲永久国产精品 | 激情婷婷欧美 | 伊人永久在线 | 久草91视频 | 在线观看成人国产 | 岛国av在线 | 中文字幕91 | 在线涩涩 | 国产精品白丝av | 国产一级性生活 | 久久久国产视频 | 99国产精品免费网站 | 亚洲精品乱码白浆高清久久久久久 | 婷婷中文字幕综合 | 亚洲最大成人网4388xx | 欧美黄色成人 | 精品国产乱码久久久久久久 | 久久躁日日躁aaaaxxxx | 日本精品视频在线观看 | 在线免费观看视频一区二区三区 | 在线观看中文字幕2021 | 99久久激情 | 国产主播大尺度精品福利免费 | 国产精品亚 | 免费a网站 | 久久综合婷婷综合 | 国产精品久久99综合免费观看尤物 | 成人免费一级 | 亚洲狠狠操 | 高清av在线免费观看 | 狠狠色狠狠色综合系列 | 色99色| 成人在线网站观看 | 日韩亚洲在线观看 | 精品亚洲一区二区三区 | 免费在线观看a v | 国产精品黄色 | 国产剧情一区二区在线观看 | 久久久久久国产精品免费 | 国产成人久久77777精品 | 国产精品黑丝在线观看 | 日本三级久久 | 午夜精品久久久久久久99婷婷 | 四虎在线观看网址 | 亚洲精品乱码久久久久久蜜桃91 | 看v片| 欧美日韩免费一区二区 | 韩国av在线播放 | www.五月天 | 久久久久久久久久久精 | 水蜜桃亚洲一二三四在线 | 97视频精品 | 亚洲男男gaygayxxxgv | 在线看欧美 | 中文字幕日韩av | 狠狠88综合久久久久综合网 | 色网站在线免费观看 | 免费色网 | av黄色亚洲 | 丁香六月综合网 | 99r精品视频在线观看 | av字幕在线| 欧美午夜精品久久久久 | 日本久久电影网 | 超碰电影在线观看 | 国产美女网 | 国产精品综合久久 | 久草在线这里只有精品 | 久久精品视频18 | 欧美最猛性xxxx | 免费人人干| 亚洲国产最新 | 国产成人精品一区二区在线 | 久久精品4 | 99久久这里只有精品 | 人人干人人上 | 99久久久久成人国产免费 | 日日干夜夜干 | 狠狠狠狠狠狠狠 | 日韩视频免费 | 亚洲精品玖玖玖av在线看 | 免费色婷婷| 欧美精品亚洲精品日韩精品 | www国产精品com| 国产精品综合在线 | 国产麻豆视频网站 | 国产又黄又爽又猛视频日本 | 久久久久久视频 | 日韩av一区二区三区在线观看 | 国产又粗又硬又长又爽的视频 | 精品久久一| 婷婷午夜天| 久久午夜免费观看 | 日韩精品专区 | 操操操干干干 | 亚洲最大av | 亚洲国产偷 | 麻豆视频免费在线 | 免费在线观看视频一区 | 狠狠色狠狠色 | 国产精品美女久久久免费 | 久久综合激情 | 成人免费视频在线观看 | 91丨九色丨蝌蚪丨老版 | 日本久久免费电影 | 青青河边草观看完整版高清 | 亚洲天堂精品视频在线观看 | 四虎永久免费 | 在线不卡a| 欧美极品在线播放 | 国产精品v a免费视频 | 中文区中文字幕免费看 | 丁香婷婷射 | 99精品视频在线播放免费 | 国产一级二级在线播放 | 成人欧美一区二区三区在线观看 | 日韩欧美精品一区 | 国产老熟 | 精品视频在线视频 | 在线观看91精品国产网站 | 日韩在线无| 97在线观看免费视频 | 五月天综合在线 | 日韩免费在线播放 | 欧美日韩国产精品一区二区亚洲 | 最近日本字幕mv免费观看在线 | 一区二区视频在线观看免费 | av中文字幕在线免费观看 | 六月激情丁香 | 亚洲久草视频 | 国产精品精品久久久 | 国产色久| 免费观看9x视频网站在线观看 | 成人影视免费 | 久久极品 | 五月天婷亚洲天综合网鲁鲁鲁 | 麻豆视频www | 97久久久免费福利网址 | 久久免费高清视频 | 免费视频 你懂的 | 国产精品欧美精品 | 波多野结衣动态图 | 国产亚洲综合性久久久影院 | 国产成人一区二 | 免费看成人av | 久久久久久久久久久免费av | 欧美另类xxx | 亚洲国产日韩在线 | 中文字幕精品一区二区三区电影 | 中午字幕在线 | 91在线精品视频 | 精品女同一区二区三区在线观看 | 日操干| 久久久免费精品国产一区二区 | 精品国产成人 | av成人在线网站 | 91精品啪在线观看国产线免费 | 精品国产亚洲一区二区麻豆 | 中文免费在线观看 | 免费成人av | av亚洲产国偷v产偷v自拍小说 | 91av中文 | 日本在线观看一区二区 | 国产中文视 | 美女网站视频一区 | 国产一级黄色免费看 | 九九热精品视频在线播放 | 国产99久久久国产精品成人免费 | 中文字幕在线观看不卡 | 成人av直播 | 中文字幕视频播放 | 狠狠躁夜夜a产精品视频 | 国产精品午夜久久久久久99热 | 91精品秘密在线观看 | 亚洲精品美女在线观看播放 | 超级碰碰免费视频 | 97精品国产aⅴ | av免费看在线 | 国产午夜不卡 | 99视频+国产日韩欧美 | av日韩国产| 我要看黄色一级片 | 久草视频在线资源站 | 国产69久久久欧美一级 | 免费人做人爱www的视 | 日韩影片在线观看 | 亚洲欧美日韩精品一区二区 | 日韩v欧美v日本v亚洲v国产v | 91精品国自产在线偷拍蜜桃 | 97免费中文视频在线观看 | 国产99免费| 射久久| 午夜在线观看一区 | 亚洲国产成人精品电影在线观看 | 国产99久久久国产精品免费看 | 91av99| av网站大全免费 | 福利视频网址 | av三级在线播放 | 免费看av在线 | 日日干天天插 | 操久久网| 六月丁香激情综合色啪小说 | 亚洲人人射 | 少妇bbbb搡bbbb搡bbbb | 日韩中文字幕视频在线 | 免费观看的av| 福利视频入口 | 在线观看一区视频 | 欧美一级大片在线观看 | 91视频网址入口 | 制服丝袜一区二区 | 激情网综合| 伊香蕉大综综综合久久啪 | 97在线观看免费视频 | 99爱精品视频 | 99九九热只有国产精品 | 欧美日韩免费观看一区=区三区 | 国产69熟 | 色偷偷888欧美精品久久久 | 成 人 a v天堂 | 亚洲日本在线视频观看 | 欧美精品久久久久a | 久久综合久久综合这里只有精品 | 四虎精品成人免费网站 | 久久精品久久综合 | 色播五月激情综合网 | 久久少妇免费视频 | 欧美日韩国产mv | 黄色综合 | 黄视频网站大全 | 成人禁用看黄a在线 | 欧美一区,二区 | 亚洲日韩欧美一区二区在线 | 在线观看av不卡 | 日韩一级电影在线观看 | 国产综合婷婷 | 日韩av免费在线电影 | 亚洲一区二区黄色 | 黄色大片日本免费大片 | 高清av网站 | 亚洲精品视频在线观看视频 | 免费看黄视频 | 日韩精品在线播放 | 精品久久久久久亚洲综合网 | 国产不卡免费 | 成年人视频在线免费观看 | 91av视屏 | 欧美一二三区在线观看 | 美女网站在线观看 | 国产特黄色片 | 91精品视屏 | 极品嫩模被强到高潮呻吟91 | 国产xxxx | 午夜精品av | 国产精品白浆 | 97人人添人澡人人爽超碰动图 | 国产不卡在线视频 | 国产日韩欧美中文 | 中午字幕在线 | 337p日本大胆噜噜噜噜 | 天天干干 | 成人在线观看免费视频 | 色干综合| 永久中文字幕 | 久要激情网 | 国产精品一区二区 91 | 在线成人欧美 | 天天久久夜夜 | 丁香婷婷成人 | 日韩精品欧美专区 | 中文字幕你懂的 | 久久精品1区 | 欧美色婷婷 | 国产一区免费观看 | 97超碰人人澡人人爱 | 日韩精品欧美专区 | 欧美日韩首页 | 一区二区精品在线观看 | 在线观看日韩av | 成人h在线播放 | 午夜体验区 | 91在线视频观看 | 久久黄网站 | 欧美在线a视频 | 欧美成人亚洲成人 | 国产美女无遮挡永久免费 | 精品免费视频123区 午夜久久成人 | 国产精品99久久免费黑人 | 久久高清视频免费 | 亚洲精品66 | 97麻豆视频 | 五月天亚洲精品 | 婷婷丁香在线观看 | av在线网站大全 | 99r在线观看 | 99精品久久久 | 91女人18片女毛片60分钟 | 国产亚洲一区二区在线观看 | 免费91在线观看 | 精品一区 在线 | 国产美女免费视频 | 久久最新视频 | 91精品欧美| 国产精品国产三级国产专区53 | 日本99干网| 国内成人精品视频 | 五月婷婷在线综合 | 在线视频日韩 | 美女网站色 | 午夜久久久久久久 | 国产日产精品一区二区三区四区 | 欧美日韩精品二区第二页 | 国产精品久久久久久久av大片 | 久久精品视频2 | av高清一区二区三区 | 久久久久久网址 | 免费av网站观看 | 麻豆小视频在线观看 | 成人av影视观看 | 精品久久久久国产免费第一页 | 国内精品久久久精品电影院 | 天天操天天色综合 | 五月天六月婷婷 | 在线成人国产 | 国产欧美综合在线观看 | 曰韩在线| 五月天天在线 | 玖玖在线视频观看 | 在线成人高清电影 | 最近免费观看的电影完整版 | 亚洲国产日韩欧美 | 免费国产在线精品 | 亚洲国产97在线精品一区 | 99热这里只有精品8 久久综合毛片 | 久久久久亚洲精品中文字幕 | 国产原创中文在线 | 不卡电影免费在线播放一区 | 国产精品久久久久高潮 | 色五月成人| 国产永久网站 | 亚洲国内精品在线 | 国产成人a v电影 | 91激情视频在线 | 黄色国产高清 | 亚洲精品免费看 | 日韩欧美在线观看一区二区三区 | 99视频偷窥在线精品国自产拍 | 粉嫩av一区二区三区四区 | 国产一二三四在线视频 | 欧美韩日精品 | 色播五月婷婷 | 麻豆传媒在线免费看 | 精品福利av | 成人一级片在线观看 | 欧美 日韩精品 | 色婷婷激情网 | 欧美精品在线一区二区 | 中文字幕乱码日本亚洲一区二区 | 国产麻豆精品久久 | 欧美va天堂va视频va在线 | 久久免费公开视频 | 日韩一区二区三免费高清在线观看 | 美女久久久久久久久久久 | 波多野结衣在线播放视频 | av一级二级| 少妇视频一区 | 麻花传媒mv免费观看 | 国产黄a三级三级 | 国产成人黄色在线 | 亚洲精品男人天堂 | 成人黄色免费观看 | av经典在线| 三级黄免费看 | 特级a老妇做爰全过程 | 天天操天天色天天射 | 久久爱导航 | 色天天中文| 国产一区免费在线 | 精品久久一区二区三区 | 久久久国产精华液 | 亚洲精品视频在线看 | 99久久久国产免费 | 日韩精品一区二区三区电影 | 98超碰人人 | 国产精品mm | 精品国产视频在线观看 | 99视频一区二区 | 免费看短 | 亚洲一区不卡视频 | 五月激情久久久 | 五月婷婷在线视频观看 | 国色天香在线 | 91视频成人免费 | 欧美亚洲xxx | 夜夜狠狠| 九九九九色 | 四虎免费在线观看视频 | 成人免费av电影 | 成人国产精品av | 欧美成人猛片 | 狠狠色狠狠色综合日日小说 | 日本不卡一区二区三区在线观看 | 99久久婷婷国产精品综合 | 久久一二三四 | 在线观看免费国产小视频 | 中文字幕色网站 | 最新久久久 | 天天草天天干天天射 | 国产视频美女 | 色国产在线 | 免费高清在线视频一区· | 日日爱网站 | 日韩免费成人av | 在线一区电影 | 黄色av免费 | 黄在线免费观看 | 国产成人免费高清 | 97人人看 | 亚洲三级黄 | 久久久久成人精品 | 激情综合狠狠 | 91视频在线网址 | 日本bbbb摸bbbb| 久久 地址| 网站免费黄 | 中文视频一区二区 | 国产免费久久久久 | 天天综合日日夜夜 | 一区二区三区在线免费 | 久久久免费视频播放 | 久久艹精品 | 蜜桃视频色 | 91福利试看| 日韩免费高清 | 精品国产_亚洲人成在线 | 999视频网站 | 97超碰在线播放 | 波多野结衣在线中文字幕 | www欧美色| 色婷婷www | www.五月婷婷 | 99精品免费久久久久久久久 | 日本h视频在线观看 | 免费色视频在线 | 草草草影院 | 国产成人资源 | 91日韩在线专区 | 毛片一区二区 | 玖玖精品视频 | 成人av影视| 免费电影一区二区三区 | 欧美日韩精品电影 | 人人澡人人干 | 不卡中文字幕在线 | 黄色免费看片网站 | 国产一区二区精品久久 | 精品国产片 | 日韩欧美在线观看 | 东方av免费在线观看 | 在线视频一区二区 | 成人久久影院 | 韩日电影在线观看 | 久久久99精品免费观看乱色 | 麻豆一二 | 亚洲成年片 | 伊人五月在线 | 天天综合网国产 | 天天操天天操天天爽 | 97视频人人免费看 | 久久人人97超碰国产公开结果 | 91日韩免费 | 91一区啪爱嗯打偷拍欧美 | 三级av在线播放 | 国产大片黄色 | 日韩av手机在线观看 | 999视频网 | 国产日本在线 | 国产麻豆传媒 | 国产麻豆精品久久 | 日韩三级视频在线观看 | 欧美不卡视频在线 | 免费一级特黄毛大片 | 日本亚洲国产 | 日韩免费一级a毛片在线播放一级 | 99热在线看| 国产福利一区二区在线 | 国产成人免费观看久久久 | 999一区二区三区 | 国产精品久久久久久婷婷天堂 | 免费看黄色小说的网站 | 国产精品日韩久久久久 | 欧美成人中文字幕 | 日韩久久午夜一级啪啪 | 国产原创在线视频 | 亚洲成人国产精品 | 一级黄色片在线观看 | 欧美成人h版在线观看 | 亚洲一二区视频 | 毛片在线播放网址 | 色wwwww| 有没有在线观看av | 亚洲一区欧美激情 | 天天综合网在线观看 | 黄色www免费 | 精品91在线 | 欧美日韩中文另类 | 亚洲一区二区三区精品在线观看 | 天天操偷偷干 | 最近日本中文字幕a | 黄色国产成人 | 黄色成人av网址 | 免费黄色一区 | 日韩在线观看中文字幕 | 日韩特黄一级欧美毛片特黄 | 久久久久久久看片 | 中文字幕一区二区三 | 成人av影视观看 | 婷婷九月激情 | 久久综合在线 | 丁香六月婷婷综合 | 最新av电影网址 | 99视频偷窥在线精品国自产拍 | 日本在线观看黄色 | 国产亚洲精品久久久久久久久久 | 激情欧美日韩一区二区 | 日日草天天草 | 久久视频在线观看中文字幕 | 91麻豆精品一区二区三区 | free. 性欧美.com | 精品在线视频播放 | 久久国内精品99久久6app | 欧美激情第一页xxx 午夜性福利 | 欧美少妇xxxxxx | 亚洲精品在线免费 | av中文字幕在线免费观看 | 国产精品美女在线观看 | 黄色一集片 | 欧美va天堂va视频va在线 | 天天干天天操天天入 | 欧美国产日韩在线视频 | 亚洲国产美女久久久久 | 国产在线超碰 | 天天操天天草 | 黄色福利网 | 欧美一级艳片视频免费观看 | a资源在线 | 日本久久99 | 国产精品videossex国产高清 | 国产精品a久久久久 | 精品国产乱码 | 国产亚洲精品女人久久久久久 | 国产精品麻豆欧美日韩ww | 中文字幕一区二区三区四区久久 | 国产精品视频全国免费观看 | 婷婷久久五月 | 久久成人免费电影 | 久久久久激情视频 | 成人国产精品av | 日韩精品专区 | 国产粉嫩在线观看 | 中文字幕的 | 热久久免费视频 | 91精品国产福利 | 国产免费久久久久 | 992tv在线| 亚洲精品一区二区三区四区高清 | 精品久久电影 | 黄色av成人在线 | av 在线观看 | 免费国产在线精品 | a色网站| 成人91免费视频 | 91成熟丰满女人少妇 | 国产亚洲高清视频 | 国产精品 视频 | 狠狠操狠狠干天天操 | 欧美亚洲国产一卡 | 五月天综合网 | 久草在线观看视频免费 | 亚洲天天综合网 | 国产亚洲日 | 中文字幕一区二区三区视频 | 国产又粗又猛又黄 | 欧美在线一 | 日韩美av在线 | 亚洲aⅴ在线 | 一区av在线播放 | 色吊丝在线永久观看最新版本 | 91av电影在线观看 | 久久99精品久久久久久三级 | 亚洲 欧美 国产 va在线影院 | 中文字幕专区高清在线观看 | 91色在线观看视频 | 成全在线视频免费观看 | 日日夜夜天天久久 | 91理论片午午伦夜理片久久 | 国产精品女同一区二区三区久久夜 | 少妇资源站 | 成人在线观看资源 | 欧美国产日韩在线观看 | 成人av在线看 | 在线观看免费视频你懂的 | 久久久国产毛片 | 国产精品久久久久久久久久 | 日韩高清免费无专码区 | 粉嫩av一区二区三区入口 | 免费在线观看不卡av | 久久一区二区三区超碰国产精品 | 日本三级人妇 | 中文字幕在线观看视频网站 | 日韩高清在线观看 | 日韩免费一级a毛片在线播放一级 | 91香蕉视频| 久久久久激情电影 | 欧美日韩色婷婷 | 就色干综合| 国产男女免费完整视频 | 久久精品欧美一区 | 国产欧美高清 | 亚洲一区 av | 国产精品免费一区二区三区在线观看 | 亚洲成a人片综合在线 |