PyQt5編程(43)—使用數(shù)據(jù)庫(9)

4.2 與表格關(guān)聯(lián)的模型
如果要編輯數(shù)據(jù)庫中的數(shù)據(jù)缓呛,城使用QSqlTableModel類栓霜。 QSqlTableModel類的繼承層次如下: 
QObject - QAbstractltemModel - QAbstractTableModel - QSqlQueryModel - QSqlTableModel
QSqlTableModel類的構(gòu)造函數(shù)為:
QSqlTableModel([QObject parent = Q_NULLPTR][, QSqlDatabase db = QSqlDatabase()]):創(chuàng)建一個父類為parent的QSqlTableModel實例晦雨,并將數(shù)據(jù)庫連接設(shè)置為db帮孔。 如果db無效拂封,將使用默認的數(shù)據(jù)庫連接落竹。
QSqlTableModel類繼承了QSqlQueryModel類中的所有方法,除此之外享扔,還定義了以下方法(詳見http://doc.qt.io/qt-5/qsqltablemodel.html):

setTable(QString tableName): 設(shè)置呈現(xiàn)在模型中的數(shù)據(jù)庫中的tableName表。該方法只是讀取表結(jié)構(gòu)信息植袍,并不包括數(shù)據(jù)惧眠。
tableName():呈現(xiàn)在模型中的數(shù)據(jù)庫表名。
setSort(int column, Qt.SortOrder order): 設(shè)置數(shù)據(jù)按column進行order方式排序于个。
setFilter( QString filter):設(shè)置過濾器為filter.過濾器是一個沒有關(guān)鍵字WHERE的SQL WHERE子句氛魁,例如:name='Josephine'
filter():返回過濾器。
select(): 根據(jù)排序方式、過濾器秀存,將數(shù)據(jù)填充到表格中捶码。
setEditStrategy(EditStrategy strategy):設(shè)置編輯策略。EditStrategy枚舉變量有下列值:
    OnFieldChange:模型的所有更改將立即作用于數(shù)據(jù)庫或链。
    OnRowChange:當切換到其他行時惫恼,模型的更改作用于數(shù)據(jù)庫。
    OnManualSubmit:模型中的理改先緩存澳盐,僅調(diào)用submitAll()或 revertAll()后祈纯,才作用于數(shù)據(jù)庫。
insertRow(int row[, QModelIndex  parent= QModelIndex()]): 在row條記錄前增加一條叼耙。
insertRows(int row,int count,[, QModelIndex  parent= QModelIndex()]): 在row條記錄前增加count條記錄腕窥。
setData(QModelIndex index, const QVariant value, int role = Qt.EditRole):設(shè)置index索引的值為value.
removeRow(int row[, QModelIndex parent = QModelIndex()]):刪除第row條記錄。
removeRows(int row,int count[, QModelIndex parent = QModelIndex()]):刪除第row條開始的count條記錄筛婉。

 注意:
通過調(diào)用removeRow( )或removeRows( )方法刪除條目后簇爆,將在模型中留下空記錄,但并不代表數(shù)據(jù)庫表中的任何記錄爽撒,所以需要調(diào)用selec()方法重新讀取模型中的數(shù)據(jù)來刪除model中的空記錄入蛆。

insertRecord(int row, QSqlRecord record):在row位置插入記錄record.如果,row為-1,表示在末尾插入硕勿。
setRecord(int row, QSqlRecord values):將模型中row行的內(nèi)容用values取代安寺。 源和目標字段是按字段名稱映射,而不是按記錄中的位置首尼。
submit(): 如果設(shè)置了OnManualSubmit編輯模式挑庶,則將當前記錄中所做的更改作用于數(shù)據(jù)庫。 
submitAll(): 如果設(shè)置了OnManualSubmit編輯模式软能,則將模型中所有修改的記錄作用于數(shù)據(jù)庫迎捺。 
revert():如果設(shè)置了OnManualSubmit編輯模式,則取消當前記錄中所做的更改查排。
revertRow(int row):如果設(shè)置了OnManualSubmit編輯模式凳枝,則取消對row條記錄所做的更改。
revertAll():如果設(shè)置了OnManualSubmit編輯模式跋核,則取消對所有記錄所做的更改岖瑰。
selectRow(int row):使用數(shù)據(jù)庫表row行的值刷新模型中的對應(yīng)行。
isDirty([QModelIndex index]):如果模型index中有尚未提交到數(shù)據(jù)庫的修改值砂代,則返回True蹋订,否則返回False。
fieldIndex(QString fieldName): 返回fieldName字段的索引刻伊;
primaryKey():返回代表主鍵的一個QSqlIndex實例露戒。

insertRecord()和setRecord()的第二個參數(shù)為QSqlRecord實例椒功,QSqlRecord類的構(gòu)造函數(shù)為:
QSqlRecord(QSqlRecord other)
 如果帶參數(shù),則是創(chuàng)建other的副本智什。通常是通過調(diào)用QSqlDatabase類的record()返回一個 QSqlRecord實例动漾。當編輯已有記錄時,則是調(diào)用QSqlTableModel類的record()荠锭,返回一個代表當前記錄的QSqlRecord實例旱眯。
QSqlRecord類除了“PyQt5編程(37)”中提到的方法外,還有以下方法:

value(int index):返回當前記錄的index字段的值证九。
value(Qstring fieldname):返回當前記錄的fieldname字段的值删豺。
setValue(int index, QVariant val):將當前記錄的index字段的值設(shè)置為val。
setValue(QString name, const QVariant val):將當前記錄的fieldname字段的值設(shè)置為val甫贯。
isNull(int index): 如果當前記錄中index字段值為空值,返回True看蚜;否則返回False叫搁。
isNull(QString name):如果當前記錄中name字段值為空值,返回True供炎;否則返回False渴逻。
setNull(int index): 設(shè)置當前記錄中index字段值為空值。
setNull(QString name):設(shè)置當前記錄中name字段值為空值音诫。
clearValues():清除記錄中所有字段的值惨奕,并將每個字段設(shè)置為空。
setGenerated(int index, bool generated):將index字段的生成標志(generated flag)置位竭钝。
setGenerated(QString name, bool generated):將name字段的生成標志(generated flag)置位梨撞。
isGenerated(int index, bool generated):返回index字段的生成標志(generated flag)。
isGenerated(QString name, bool generated):返回name字段的生成標志(generated flag)香罐。

添加記錄到模型的示例代碼:

con = QtSql.QSqlDatabase.addDatabase ('QSQLITE')
con.setDatabaseName ('data.sqlite')
con.open ()
stm = QtSql.QSqlTableModel ()
stm.setTable ('good')
stm.select ()
rec = con.record ('good')
rec.setValue ('goodname', 'Mouse pad')
rec.setValue ('goodcount', 3)
stm.insertRecord (-1, rec)

修改現(xiàn)有記錄3的示例代碼:
rec = stm.record(3)
rec.setValue('goodcount', 5)
stm.setRecord(3, rec)

QSqlTableModel類有以下信號:

primeInsert(int row, QSqlRecord record):在當前活動數(shù)據(jù)庫表的給定行中時,insertRows()觸發(fā)卧波。
beforeInsert(QSqlRecord record):在當前活動數(shù)據(jù)庫表中插入數(shù)據(jù)時,由insertRowIntoTable()觸發(fā)庇茫。
beforeUpdate(int row, QSqlRecord record):在row行記錄更新前港粱,由updateRowInTable()觸發(fā)。
beforeDelete(int row):在刪除row行數(shù)據(jù)之前旦签,由deleteRowFromTable()觸發(fā)查坪。
dataChanged(QModelIndex topLeft, QModelIndex bottomRight[, QVector roles = QVector ()]): 模型中的數(shù)據(jù)變化時觸發(fā)。如果受影響的數(shù)據(jù)屬同一父類宁炫,其區(qū)域為topleft到bottomright偿曙。可選的roles參數(shù)用于指定哪些數(shù)據(jù)實際上已被修改, 該參數(shù)為空, 意味著所有數(shù)據(jù)都已修改羔巢。

如果模型為OnManualSubmit編輯模式遥昧,那么dataChanged信號是調(diào)用submit()或submitAll()方法的理想場所覆醇。下列為數(shù)據(jù)庫操作的相關(guān)代碼,它不僅可以編輯炭臭,還可以通過按下相應(yīng)的按鈕來添加和刪除記錄永脓。

from PyQt5 import QtCore, QtWidgets, QtSql
import sys

def addRecord ():
# 插入空記錄,用戶可手動輸入
stm.insertRow (stm.rowCount ())

def delRecord ():
# 從模型中刪除記錄
stm.removeRow (tv.currentIndex (). row ())
# 重新加載數(shù)據(jù)到模型中
stm.select ()

app = QtWidgets.QApplication (sys.argv)
window = QtWidgets.QWidget ()
window.setWindowTitle ("QSqlTableModel")

Establish a connection to the database

con = QtSql.QSqlDatabase.addDatabase ('QSQLITE')
con.setDatabaseName ('data.sqlite')
con.open ()

Create a model

stm = QtSql.QSqlTableModel (parent = window)
stm.setTable ('good')
stm.setSort (1, QtCore.Qt.AscendingOrder)
stm.select ()

Set the headers for the columns of the model

stm.setHeaderData (1, QtCore.Qt.Horizontal, 'Name')
stm.setHeaderData (2, QtCore.Qt.Horizontal, 'Qty')

Set the table just created for the table

vbox = QtWidgets.QVBoxLayout ()
tv = QtWidgets.QTableView ()
tv.setModel (stm)

隱藏第一列

tv.hideColumn (0)
tv.setColumnWidth (1, 150)
tv.setColumnWidth (2, 60)
vbox.addWidget (tv)
btnAdd = QtWidgets.QPushButton ("添加記錄(&A)")
btnAdd.clicked.connect (addRecord)
vbox.addWidget (btnAdd)
btnDel = QtWidgets.QPushButton ("刪除記錄(&A")
btnDel.clicked.connect (delRecord)
vbox.addWidget (btnDel)
window.setLayout (vbox)
window.resize (300, 250)
window.show ()
sys.exit (app.exec_ ())
<wbr> <wbr> 4.2 與表格關(guān)聯(lián)的模型

<wbr> <wbr> 如果要編輯數(shù)據(jù)庫中的數(shù)據(jù)鞋仍,城使用QSqlTableModel類常摧。 <wbr>QSqlTableModel類的

繼承層次如下: <wbr>

<font face="Microsoft YaHei, Helvetica Neue, SimSun" color="#494949"> <wbr> <wbr> <wbr></font>QObject - QAbstractltemModel - QAbstractTableModel - QSqlQueryModel - QSqlTableModel

<wbr> <wbr> QSqlTableModel類的構(gòu)造函數(shù)為:

<wbr> <wbr> QSqlTableModel([QObject parent = Q_NULLPTR][, QSqlDatabase db = QSqlDatabase()]):創(chuàng)建一個父類為parent的QSqlTableModel實例,并將數(shù)據(jù)庫連接設(shè)置為db威创。 如果db無效落午,將使用默認的數(shù)據(jù)庫連接。

<wbr> <wbr> <wbr>QSqlTableModel類繼承了QSqlQueryModel類中的所有方法肚豺,除此之外溃斋,還定義了以下方法(詳見http://doc.qt.io/qt-5/qsqltablemodel.html):

  • setTable(QString tableName): 設(shè)置呈現(xiàn)在模型中的數(shù)據(jù)庫中的tableName表。該方法只是讀取表結(jié)構(gòu)信息吸申,并不包括數(shù)據(jù)梗劫。
  • tableName():呈現(xiàn)在模型中的數(shù)據(jù)庫表名。
  • setSort(int column, Qt.SortOrder order): 設(shè)置數(shù)據(jù)按column進行order方式排序截碴。
  • setFilter( <wbr>QString filter):設(shè)置過濾器為filter.過濾器是一個沒有關(guān)鍵字WHERE的SQL WHERE子句梳侨,例如:name='Josephine'
  • filter():返回過濾器。
  • select(): 根據(jù)排序方式日丹、過濾器走哺,將數(shù)據(jù)填充到表格中。
  • setEditStrategy(EditStrategy strategy):設(shè)置編輯策略哲虾。EditStrategy枚舉變量有下列值:
    • OnFieldChange:模型的所有更改將立即作用于數(shù)據(jù)庫丙躏。
    • OnRowChange:當切換到其他行時,模型的更改作用于數(shù)據(jù)庫束凑。
    • OnManualSubmit:模型中的理改先緩存彼哼,僅調(diào)用submitAll()或 revertAll()后,才作用于數(shù)據(jù)庫湘今。
  • insertRow(int row[, QModelIndex <wbr>parent= QModelIndex()]): 在row條記錄前增加一條敢朱。
  • insertRows(int row,int count,[, QModelIndex <wbr>parent= QModelIndex()]): 在row條記錄前增加count條記錄。
  • setData(QModelIndex index, const QVariant value, int role = Qt.EditRole):設(shè)置index索引的值為value.
  • removeRow(int row[, QModelIndex parent = QModelIndex()]):刪除第row條記錄摩瞎。
  • removeRows(int row,int count[, QModelIndex parent = QModelIndex()]):刪除第row條開始的count條記錄拴签。

<font color="#FF0000"> <wbr> <wbr> <wbr>注意:</font>

<wbr> <wbr> 通過調(diào)用removeRow( )或removeRows( )方法刪除條目后,將在模型中留下空記錄旗们,但并不代表數(shù)據(jù)庫表中的任何記錄蚓哩,所以需要調(diào)用selec()方法重新讀取模型中的數(shù)據(jù)來刪除model中的空記錄。

  • insertRecord(int row, QSqlRecord record):在row位置插入記錄record.如果,row為-1上渴,表示在末尾插入岸梨。
  • setRecord(int row, QSqlRecord values):將模型中row行的內(nèi)容用values取代喜颁。 源和目標字段是按字段名稱映射,而不是按記錄中的位置曹阔。
  • submit(): <wbr>如果設(shè)置了OnManualSubmit編輯模式半开,則將當前記錄中所做的更改作用于數(shù)據(jù)庫。 <wbr>
  • submitAll(): <wbr>如果設(shè)置了OnManualSubmit編輯模式赃份,則將模型中所有修改的記錄作用于數(shù)據(jù)庫寂拆。 <wbr>
  • revert():如果設(shè)置了OnManualSubmit編輯模式,則取消當前記錄中所做的更改抓韩。
  • revertRow(int row):如果設(shè)置了OnManualSubmit編輯模式纠永,則取消對row條記錄所做的更改。
  • revertAll():如果設(shè)置了OnManualSubmit編輯模式谒拴,則取消對所有記錄所做的更改尝江。
  • selectRow(int row):使用數(shù)據(jù)庫表row行的值刷新模型中的對應(yīng)行。
  • isDirty([QModelIndex index]):如果模型index中有尚未提交到數(shù)據(jù)庫的修改值英上,則返回True炭序,否則返回False。
  • fieldIndex(QString fieldName): 返回fieldName字段的索引善延;
  • primaryKey():返回代表主鍵的一個QSqlIndex實例少态。

<wbr> <wbr> insertRecord()和setRecord()的第二個參數(shù)為QSqlRecord實例城侧,QSqlRecord類的構(gòu)造函數(shù)為:
<wbr> <wbr> <wbr>QSqlRecord(QSqlRecord other)
<wbr> <wbr> <wbr>如果帶參數(shù)易遣,則是創(chuàng)建other的副本。通常是通過調(diào)用QSqlDatabase類的record()返回一個 QSqlRecord實例嫌佑。當編輯已有記錄時豆茫,則是調(diào)用QSqlTableModel類的record(),返回一個代表當前記錄的QSqlRecord實例屋摇。

<wbr> <wbr> QSqlRecord類除了“PyQt5編程(37)”中提到的方法外揩魂,還有以下方法:

  • value(int index):返回當前記錄的index字段的值。
  • value(Qstring fieldname):返回當前記錄的fieldname字段的值炮温。
  • setValue(int index, QVariant val):將當前記錄的index字段的值設(shè)置為val火脉。
  • setValue(QString name, const QVariant val):將當前記錄的fieldname字段的值設(shè)置為val。
  • isNull(int index): 如果當前記錄中index字段值為空值柒啤,返回True倦挂;否則返回False。
  • isNull(QString name):如果當前記錄中name字段值為空值担巩,返回True方援;否則返回False。
  • setNull(int index): 設(shè)置當前記錄中index字段值為空值涛癌。
  • setNull(QString name):設(shè)置當前記錄中name字段值為空值犯戏。
  • clearValues():清除記錄中所有字段的值送火,并將每個字段設(shè)置為空。
  • setGenerated(int index, bool generated):將index字段的生成標志(generated flag)置位先匪。
  • setGenerated(QString name, bool generated):將name字段的生成標志(generated flag)置位种吸。
  • isGenerated(int index, bool generated):返回index字段的生成標志(generated flag)。
  • isGenerated(QString name, bool generated):返回name字段的生成標志(generated flag)胚鸯。

<wbr> <wbr> 添加記錄到模型的示例代碼:

con = QtSql.QSqlDatabase.addDatabase ('QSQLITE')

con.setDatabaseName ('data.sqlite')

con.open ()

stm = QtSql.QSqlTableModel ()

stm.setTable ('good')

stm.select ()

rec = con.record ('good')

rec.setValue ('goodname', 'Mouse pad')

rec.setValue ('goodcount', 3)

stm.insertRecord (-1, rec)

修改現(xiàn)有記錄3的示例代碼:

rec = stm.record(3)

rec.setValue('goodcount', 5)

stm.setRecord(3, rec)

QSqlTableModel類有以下信號:

  • primeInsert(int row, QSqlRecord record):在當前活動數(shù)據(jù)庫表的給定行中時,insertRows()觸發(fā)骨稿。
  • beforeInsert(QSqlRecord record):在當前活動數(shù)據(jù)庫表中插入數(shù)據(jù)時,由insertRowIntoTable()觸發(fā)姜钳。
  • beforeUpdate(int row, QSqlRecord record):在row行記錄更新前坦冠,由updateRowInTable()觸發(fā)。
  • beforeDelete(int row):在刪除row行數(shù)據(jù)之前哥桥,由deleteRowFromTable()觸發(fā)辙浑。
  • dataChanged(QModelIndex topLeft, QModelIndex bottomRight[, QVector roles = QVector ()]): 模型中的數(shù)據(jù)變化時觸發(fā)。如果受影響的數(shù)據(jù)屬同一父類拟糕,其區(qū)域為topleft到bottomright判呕。可選的roles參數(shù)用于指定哪些數(shù)據(jù)實際上已被修改, 該參數(shù)為空, 意味著所有數(shù)據(jù)都已修改送滞。

<wbr> <wbr> <wbr>如果模型為OnManualSubmit編輯模式侠草,那么dataChanged信號是調(diào)用submit()或submitAll()方法的理想場所。下列為數(shù)據(jù)庫操作的相關(guān)代碼犁嗅,它不僅可以編輯边涕,還可以通過按下相應(yīng)的按鈕來添加和刪除記錄。

from PyQt5 import QtCore, QtWidgets, QtSql

import sys

def addRecord ():

<wbr> <wbr> # 插入空記錄褂微,用戶可手動輸入 <wbr>

<wbr> <wbr> stm.insertRow (stm.rowCount ())

def delRecord ():

<wbr> <wbr> # 從模型中刪除記錄

<wbr> <wbr> stm.removeRow (tv.currentIndex (). row ())

<wbr> <wbr> # 重新加載數(shù)據(jù)到模型中

<wbr> <wbr> stm.select ()

app = QtWidgets.QApplication (sys.argv)

window = QtWidgets.QWidget ()

window.setWindowTitle ("QSqlTableModel")

Establish a connection to the database

con = QtSql.QSqlDatabase.addDatabase ('QSQLITE')

con.setDatabaseName ('data.sqlite')

con.open ()

Create a model

stm = QtSql.QSqlTableModel (parent = window)

stm.setTable ('good')

stm.setSort (1, QtCore.Qt.AscendingOrder)

stm.select ()

Set the headers for the columns of the model

stm.setHeaderData (1, QtCore.Qt.Horizontal, 'Name')

stm.setHeaderData (2, QtCore.Qt.Horizontal, 'Qty')

Set the table just created for the table

vbox = QtWidgets.QVBoxLayout ()

tv = QtWidgets.QTableView ()

tv.setModel (stm)

隱藏第一列

tv.hideColumn (0)

tv.setColumnWidth (1, 150)

tv.setColumnWidth (2, 60)

vbox.addWidget (tv)

btnAdd = QtWidgets.QPushButton ("添加記錄(&A)")

btnAdd.clicked.connect (addRecord)

vbox.addWidget (btnAdd)

btnDel = QtWidgets.QPushButton ("刪除記錄(&A")

btnDel.clicked.connect (delRecord)

vbox.addWidget (btnDel)

window.setLayout (vbox)

window.resize (300, 250)

window.show ()

sys.exit (app.exec_ ())

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末功蜓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宠蚂,更是在濱河造成了極大的恐慌式撼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件求厕,死亡現(xiàn)場離奇詭異著隆,居然都是意外死亡,警方通過查閱死者的電腦和手機呀癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門美浦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人十艾,你說我怎么就攤上這事抵代。” “怎么了忘嫉?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵荤牍,是天一觀的道長案腺。 經(jīng)常有香客問我,道長康吵,這世上最難降的妖魔是什么劈榨? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮晦嵌,結(jié)果婚禮上同辣,老公的妹妹穿的比我還像新娘。我一直安慰自己惭载,他們只是感情好旱函,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著描滔,像睡著了一般棒妨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上含长,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天券腔,我揣著相機與錄音,去河邊找鬼拘泞。 笑死纷纫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的陪腌。 我是一名探鬼主播辱魁,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偷厦!你這毒婦竟也來了商叹?” 一聲冷哼從身側(cè)響起燕刻,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤只泼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卵洗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體请唱,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年过蹂,在試婚紗的時候發(fā)現(xiàn)自己被綠了十绑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡酷勺,死狀恐怖本橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆诉,我是刑警寧澤甚亭,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布贷币,位于F島的核電站,受9級特大地震影響亏狰,放射性物質(zhì)發(fā)生泄漏役纹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一暇唾、第九天 我趴在偏房一處隱蔽的房頂上張望促脉。 院中可真熱鬧,春花似錦策州、人聲如沸瘸味。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硫戈。三九已至,卻和暖如春下硕,著一層夾襖步出監(jiān)牢的瞬間丁逝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工梭姓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留霜幼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓誉尖,卻偏偏與公主長得像罪既,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铡恕,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容