布局管理

總結(jié)

布局的計(jì)算過程

  • 如果設(shè)置了最小尺寸(或者最小尺寸提示)帚戳、最大尺寸坡贺,則組件獲取的空間不能超過這些限制
  • 如果沒有設(shè)置尺寸限制厦滤,則組件會(huì)盡可能多的占據(jù)空間次兆。如果有多個(gè)組件稿茉,則空間分配以拉伸因子為標(biāo)準(zhǔn)
  • 如果沒有設(shè)置拉升因子,則以組件的尺寸策略 QWidget :: sizePolicy() 和尺寸提示 QWidget :: sizeHint() 為依據(jù)芥炭,在有多余空間的情況下漓库,盡可能的占據(jù)多的空間。這也是組件的默認(rèn)尺寸

組件中對布局有影響的函數(shù)

一個(gè)組件要想影響布局管理园蝠,需要使用以下任何或全部機(jī)制:

  • 重新實(shí)現(xiàn) QWidget :: sizeHint() 以返回小部件的首選大小渺蒿。
  • 重新實(shí)現(xiàn) QWidget :: minimumSizeHint() 以返回小部件可以具有的最小尺寸。
  • 調(diào)用 QWidget :: setSizePolicy() 來指定窗口小部件的空間要求砰琢。

在上面的任何一個(gè)操作之后蘸嘶,都應(yīng)調(diào)用 QWidget :: updateGeometry() 良瞧,這將導(dǎo)致布局重新計(jì)算。即使多次連續(xù)調(diào)用 QWidget :: updateGeometry() 也只會(huì)進(jìn)行一次布局重新計(jì)算训唱。

如果 Widget 的高度依賴于其寬度(例如褥蚯,具有自動(dòng)斷字的標(biāo)簽),請?jiān)诖翱谛〔考拇笮〔呗灾性O(shè)置 height-for-width 標(biāo)志况增,并重新實(shí)現(xiàn) QWidget :: heightForWidth() 函數(shù)赞庶。

即使實(shí)現(xiàn) QWidget :: heightForWidth() ,提供一個(gè)合理的 sizeHint()仍然是一個(gè)好主意澳骤。

自定義布局管理器

要編寫自己的布局類歧强,必須定義以下內(nèi)容:

  • 一個(gè)用于存儲(chǔ)被管理組件的數(shù)據(jù)結(jié)構(gòu),其中項(xiàng)是 QLayoutItem 類型 为肮,一般使用列表摊册。
  • addItem(),如何添加項(xiàng)目到布局颊艳。
  • setGeometry()茅特,如何執(zhí)行布局。
  • sizeHint()棋枕,布局的首選大小白修。
  • itemAt(),如何迭代布局重斑。
  • takeAt()兵睛,如何從布局中刪除項(xiàng)目。
  • 在大多數(shù)情況下窥浪,您還將實(shí)現(xiàn) minimumSize()祖很。

Qt 布局系統(tǒng)提供了一種簡單而強(qiáng)大的方式,可以在 Widget 中自動(dòng)排列子元素漾脂,以確保它們充分利用可用空間突琳。

簡介

Qt 包括一組布局管理類,用于描述在應(yīng)用程序的用戶界面中如何布局 Widget符相。 當(dāng)可用的空間發(fā)生變化時(shí),這些布局會(huì)自動(dòng)定位和調(diào)整 Widget 的大小蠢琳,確保它們一致地排列啊终,并且整個(gè)用戶界面保持可用。

所有 QWidget 的子類都可以使用布局來管理他們的子元素傲须, QWidget :: setLayout() 函數(shù)將一個(gè) Layout 應(yīng)用于 Widget蓝牲, 當(dāng)以這種方式在 Widget 上設(shè)置了一個(gè) Layout 時(shí),Layout 負(fù)責(zé)以下任務(wù):

  • 子元素的定位泰讽。
  • 合理的窗口默尺寸例衍。
  • 合理的的窗口最小尺寸昔期。
  • 調(diào)整大小處理
  • 內(nèi)容變化時(shí)自動(dòng)更新:
    • 字體大小,文本或子元素的其他內(nèi)容佛玄。
    • 隱藏或顯示一個(gè) Widget
    • 刪除子元素

Qt 的布局類

省略......

水平硼一、豎直、網(wǎng)格以及表格布局

為 Widget 設(shè)置布局的最簡單方法是使用內(nèi)置的布局管理器:QHBoxLayout 梦抢,QVBoxLayout 般贼,QGridLayoutQFormLayout ,這些類繼承自 QLayout 奥吩,QLayout 又來自 QObject (而不是 QWidget )哼蛆, 他們負(fù)責(zé)一組 Widgets 的幾何管理。 要?jiǎng)?chuàng)建更復(fù)雜的布局霞赫,可以將布局管理器嵌套在一起腮介。

  • QHBoxLayout 從左到右(或從右到左)橫向排列出 Widget。

    img
  • QVBoxLayout 從上到下在垂直排列 Widget

    img
  • QGridLayout 在二維網(wǎng)格中顯示 Widget端衰,一個(gè) 小部件可以占用多個(gè)單元格

    img
  • QFormLayout 在以兩列描述性的“標(biāo)簽-字段樣式” 樣式布局 Widget

    img

用代碼布局 Widget

以下代碼用一個(gè) QHBoxLayout 管理五個(gè) QPushButton 的幾何特征叠洗,如上圖第一個(gè)截圖所示:

QWidget *window = new QWidget;

// 創(chuàng)建五個(gè)按鈕
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

// 創(chuàng)建布局管理器
QHBoxLayout *layout = new QHBoxLayout;

// 將按鈕添加到布局中
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

// 設(shè)置布局
window->setLayout(layout);

window->show();

除了布局類本身不同之外,QVBoxLayout 的使用方式是相同的靴迫。 QGridLayout 的代碼有一些不同惕味,因?yàn)槲覀冃枰付?Widget 的行和列位置:

QWidget *window = new QWidget;

// 創(chuàng)建五個(gè)按鈕
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

// 創(chuàng)建布局管理器
QGridLayout *layout = new QGridLayout;

// 將按鈕添加到布局中
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 0, 1);
// 注意:這個(gè)按鈕占用兩個(gè)單元
layout->addWidget(button3, 1, 0, 1, 2);
layout->addWidget(button4, 2, 0);
layout->addWidget(button5, 2, 1);

// 設(shè)置布局
window->setLayout(layout);

window->show();

第三個(gè) QPushButton 跨越兩列,需要為 QGridLayout :: addWidget() 指定第四和第五個(gè)參數(shù)玉锌。

QFormLayout 在每一行上添加兩個(gè) Widget 名挥,通常是 QLabelQLineEdit ,用來創(chuàng)建表單主守。 在同一行添加 QLabelQLineEdit 會(huì)將 QLineEdit 設(shè)置為 QLabel 的伙伴控件禀倔。 以下代碼將使用 QFormLayout 在三行上放置 QPushButtons 和相應(yīng)的 QLineEdit

QWidget *window = new QWidget;

QPushButton *button1 = new QPushButton("One");
QLineEdit *lineEdit1 = new QLineEdit();
QPushButton *button2 = new QPushButton("Two");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button3 = new QPushButton("Three");
QLineEdit *lineEdit3 = new QLineEdit();

// 創(chuàng)建表格布局
QFormLayout *layout = new QFormLayout;

// 一組一組的將按鈕和編輯器放到布局中
layout->addRow(button1, lineEdit1);
layout->addRow(button2, lineEdit2);
layout->addRow(button3, lineEdit3);

window->setLayout(layout);
window->show();

使用布局的一些提示

使用布局時(shí),創(chuàng)建 Widget 不需要傳遞父對象参淫,布局管理器會(huì)自動(dòng)重新設(shè)置 Widget 的父對象(使用 QWidget :: setParent())救湖,讓它們稱為設(shè)置了布局管理器的那個(gè) Widget 的子元素。

注意:布局中的管理的 Widget 是設(shè)置布局的 Widget 的子節(jié)點(diǎn)涎才,而不是布局本身的子節(jié)點(diǎn)鞋既, Widget 只能將其他 Widget 作為父類而不是布局。

可以在布局上使用 addLayout() 嵌套布局耍铜,內(nèi)部布局外部布局的子元素

將 Widget 添加到布局中

當(dāng)您將 Widget 添加到布局中時(shí)邑闺,過程如下:

  1. 所有的 Widget 最初將根據(jù)其 QWidget :: sizePolicy()QWidget :: sizeHint() 分配一定的空間。
  2. 如果 Widget 設(shè)置了大于零的拉伸因子棕兼,則按照其拉伸因子的比例分配空間(如下所述)陡舅。
  3. 如果 Widget 的拉伸因子設(shè)置為零,則只有在其他 Widget 不需要空間的情況下才會(huì)獲得更多的空間伴挚。其中靶衍,首先將空間分配給具有 Expanding 策略的小部件灾炭。
  4. 分配的空間小于其最小尺寸的 Widget(如果沒有指定最小尺寸,則為最小尺寸提示)將分配其所需的最小尺寸颅眶。 (Widget 不一定非要設(shè)置最小尺寸或最小尺寸提示蜈出,在這種情況下,拉伸因子是其決定因素帚呼。)
  5. 分配的空間大于其最大尺寸的 Widget 都將分配其所需的最大尺寸掏缎。 (小部件不一定非要設(shè)置最大尺寸,在這種情況下煤杀,拉伸因子是其決定因素眷蜈。)

拉伸因子

Widget 創(chuàng)建的時(shí)候一般沒有設(shè)置拉伸因子。 當(dāng)它們被放到布局管理器中時(shí)沈自,Widget 將根據(jù)其 QWidget :: sizePolicy() 或其最小大小提示給予一定的空間份額酌儒,以較大者為準(zhǔn)。 拉伸因子用于改變彼此占據(jù)空間的比例

如果將三個(gè)沒有設(shè)置拉伸因子的 Widget 放到 QHBoxLayout 布局中枯途,我們將得到如下布局:

img

如果我們對每個(gè) Widget 設(shè)置拉伸因子忌怎,它們將按比例(但不得小于其最小大小提示)布局。

img

自定義組件的布局

當(dāng)您創(chuàng)建自己的 Widget 類時(shí)酪夷,還應(yīng)該處理其布局屬性榴啸。如果 Widget 使用 Qt 的布局之一,這已經(jīng)被處理了晚岭。如果 Widget 沒有任何子部件鸥印,也沒有使用手動(dòng)布局,則可以使用以下任何或全部機(jī)制更改窗口小部件的行為:

  • 重新實(shí)現(xiàn) QWidget :: sizeHint() 以返回小部件的首選大小坦报。
  • 重新實(shí)現(xiàn) QWidget :: minimumSizeHint() 以返回小部件可以具有的最小尺寸库说。
  • 調(diào)用 QWidget :: setSizePolicy() 來指定窗口小部件的空間要求。

每當(dāng)大小提示片择、最小大小提示或大小策略更改時(shí)潜的,都應(yīng)調(diào)用 QWidget :: updateGeometry() ,這將導(dǎo)致布局重新計(jì)算字管。即使多次連續(xù)調(diào)用 QWidget :: updateGeometry() 也只會(huì)進(jìn)行一次布局重新計(jì)算啰挪。

如果您的小部件的首選高度依賴于其實(shí)際寬度(例如,具有自動(dòng)斷字的標(biāo)簽)嘲叔,請?jiān)诖翱谛〔考拇笮〔呗灾性O(shè)置 height-for-width 標(biāo)志脐供,并重新實(shí)現(xiàn) QWidget :: heightForWidth() 函數(shù)。

即使實(shí)現(xiàn) QWidget :: heightForWidth() 借跪,提供一個(gè)合理的 sizeHint()仍然是一個(gè)好主意。

有關(guān)實(shí)施這些功能的進(jìn)一步指導(dǎo)酌壕,請參閱Qt季刊文章 《寬度的交易高度》掏愁。

布局可能出現(xiàn)問題

在 Label 組件中使用富文本可能會(huì)在其父窗口的布局中引入一些問題歇由,當(dāng) Label 設(shè)置了 “word wrapped” 時(shí),布局管理器會(huì)發(fā)生問題果港。

在某些情況下沦泌,布局被設(shè)置為 QLayout :: FreeResize 模式,這意味著它不會(huì)調(diào)整其內(nèi)容的布局以適合較小尺寸的窗口辛掠,甚至?xí)柚褂脩魧⒋翱谧冃 ?這個(gè)問題可以通過對有問題的小部件進(jìn)行子類化谢谦,并實(shí)現(xiàn)適當(dāng)?shù)?sizeHint()minimumSizeHint() 函數(shù)來克服。

在某些情況下萝衩,Widget 必須有布局才能被使用回挽。 當(dāng)您為 QDockWidgetQScrollArea (使用 QDockWidget :: setWidget()QScrollArea :: setWidget() )設(shè)置 Widget 時(shí),必須已在 Widget 上設(shè)置布局猩谊。 如果沒有千劈,該 Widget 將不可見。

手動(dòng)布局

如果您正在制作獨(dú)一無二的特殊布局牌捷,可以按照上述方式制作自定義 Widget 墙牌。 在 QWidget :: resizeEvent() 中計(jì)算所需的空間,并調(diào)用每個(gè)子元素上調(diào)用 setGeometry() 暗甥。

當(dāng)需要重新計(jì)算布局時(shí)喜滨,Widget 將接收到一個(gè) QEvent :: LayoutRequest 的事件對象。 可以在 QWidget :: event() 中處理 QEvent :: LayoutRequest 事件撤防。

如何編寫自定義布局管理器

手動(dòng)布局的替代方法是通過對 QLayout 進(jìn)行子類化來編寫自己的布局管理器虽风。 邊框布局和流程布局示例顯示了如何做到這一點(diǎn)。

我們在這里詳細(xì)介紹一個(gè)例子即碗。 CardLayout 類收到來自同名的 Java 布局管理器的啟發(fā)焰情。 它將 Widget 放在彼此之上,每個(gè) Item 偏移 QLayout :: spacing() 距離

要編寫自己的布局類剥懒,您必須定義以下內(nèi)容:

  • 用于存儲(chǔ)被布局處理的組件的數(shù)據(jù)結(jié)構(gòu)内舟。 每個(gè)組件都是一個(gè)QLayoutItem , 在這個(gè)例子中我們將使用一個(gè) QList初橘。
  • addItem()验游,如何添加項(xiàng)目到布局。
  • setGeometry()保檐,如何執(zhí)行布局耕蝉。
  • sizeHint(),布局的首選大小夜只。
  • itemAt()垒在,如何迭代布局。
  • takeAt()扔亥,如何從布局中刪除項(xiàng)目场躯。
  • 在大多數(shù)情況下谈为,您還將實(shí)現(xiàn) minimumSize()
#ifndef CARD_H
#define CARD_H

#include <QtWidgets>
#include <QList>

class CardLayout : public QLayout
{
public:
    CardLayout(QWidget *parent, int dist): QLayout(parent, 0, dist) {}
    CardLayout(QLayout *parent, int dist): QLayout(parent, dist) {}
    CardLayout(int dist): QLayout(dist) {}
    ~CardLayout();

    void addItem(QLayoutItem *item);
    QSize sizeHint() const;
    QSize minimumSize() const;
    int count() const;
    QLayoutItem *itemAt(int) const;
    QLayoutItem *takeAt(int);
    void setGeometry(const QRect &rect);

private:
    QList<QLayoutItem*> list;
};

#endif

實(shí)現(xiàn)文件 card.cpp

//#include "card.h"

首先得定義一個(gè) count() 函數(shù)來獲得列表中的項(xiàng)數(shù)

int CardLayout::count() const
{
    // QList::size() returns the number of QLayoutItems in the list
    return list.size();
}

然后重寫 itemAt()takeAt() 這兩個(gè)函數(shù)踢关,這些函數(shù)在布局系統(tǒng)內(nèi)部用于處理 Widget 的刪除伞鲫,當(dāng)然,程序員也可以直接使用它們签舞。

itemAt() 返回給定索引處的 Item 秕脓。 takeAt() 刪除給定索引處的 Item ,并返回它儒搭。 這里吠架,我們使用列表索引作為布局索引。 在其他情況下师妙,我們有一個(gè)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)诵肛,我們可能需要花費(fèi)更多的精力為 Item 定義線性順序。

QLayoutItem *CardLayout::itemAt(int idx) const
{
    // QList::value() performs index checking, and returns 0 if we are
    // outside the valid range
    return list.value(idx);
}

QLayoutItem *CardLayout::takeAt(int idx)
{
    // QList::take does not do index checking
    return idx >= 0 && idx < list.size() ? list.takeAt(idx) : 0;
}

addItem() 為布局 Item 實(shí)現(xiàn)了默認(rèn)放置策略默穴,這個(gè)函數(shù)必須被實(shí)現(xiàn)怔檩,他會(huì)被 QLayout :: add() 使用。 如果您的布局具有需要參數(shù)的高級(jí)放置選項(xiàng)蓄诽,則必須提供額外的訪問函數(shù)薛训,例如還來間距 QGridLayout :: addItem()QGridLayout :: addWidget()QGridLayout :: addLayout() 的重載

void CardLayout::addItem(QLayoutItem *item)
{
  list.append(item);
}

注意:QLayoutItem 不是繼承自 QObject 因此仑氛,必須手動(dòng)銷毀

 CardLayout::~CardLayout()
  {
       QLayoutItem *item;
       while ((item = takeAt(0)))
           delete item;
  }

setGeometry() 實(shí)際計(jì)算各個(gè)組件的位置和尺寸乙埃,如果需要,計(jì)算的時(shí)候可以將 spacing() 考慮進(jìn)去锯岖,但是不考慮 margin()

void CardLayout::setGeometry(const QRect &r)
{
  QLayout::setGeometry(r);

  if (list.size() == 0)
      return;

  int w = r.width() - (list.count() - 1) * spacing();
  int h = r.height() - (list.count() - 1) * spacing();
  int i = 0;
  while (i < list.size()) {
      QLayoutItem *o = list.at(i);
      QRect geom(r.x() + i * spacing(), r.y() + i * spacing(), w, h);
      o->setGeometry(geom);
      ++i;
  }
}

sizeHint()minimumSize() 的實(shí)現(xiàn)非常類似介袜,他們都可以考慮 spacing() 但是不考慮 margin()

QSize CardLayout::sizeHint() const
{
  QSize s(0,0);
  int n = list.count();
  if (n > 0)
          s = QSize(100,70); //start with a nice default size
      int i = 0;
      while (i < n) {
          QLayoutItem *o = list.at(i);
          s = s.expandedTo(o->sizeHint());
          ++i;
      }
      return s + n*QSize(spacing(), spacing());
  }

  QSize CardLayout::minimumSize() const
  {
      QSize s(0,0);
      int n = list.count();
      int i = 0;
      while (i < n) {
          QLayoutItem *o = list.at(i);
          s = s.expandedTo(o->minimumSize());
          ++i;
      }
      return s + n*QSize(spacing(), spacing());
  }

其他注意事項(xiàng)

  • 此自定義布局不處理寬度的高度。
  • 我們忽略了 QLayoutItem :: isEmpty()出吹, 這意味著布局會(huì)將隱藏的小部件視為可見的遇伞。
  • 對于復(fù)雜的布局绪囱,通過緩存計(jì)算值可以大大提高速度侍郭。 在這種情況下,實(shí)現(xiàn) QLayoutItem :: invalidate() 來標(biāo)記緩存的數(shù)據(jù)是臟的锌介。
  • 調(diào)用 QLayoutItem :: sizeHint() 等可能是昂貴的秋麸。 因此渐排,如果您稍后在同一功能中再次需要,您應(yīng)該將該值存儲(chǔ)在局部變量中灸蟆。
  • 你不應(yīng)該在同一個(gè)函數(shù)的同一個(gè)項(xiàng)目上調(diào)用 QLayoutItem :: setGeometry() 兩次驯耻。 如果該項(xiàng)目具有多個(gè)子窗口小部件,則此調(diào)用可能非常昂貴,因?yàn)椴季止芾砥鞅仨毭看螆?zhí)行完整的布局可缚。 而是計(jì)算幾何體孽水,然后進(jìn)行設(shè)置。 (這不僅適用于布局城看,如果您實(shí)現(xiàn)自己的resizeEvent() ,則應(yīng)該這樣做)杏慰。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末测柠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缘滥,更是在濱河造成了極大的恐慌轰胁,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朝扼,死亡現(xiàn)場離奇詭異赃阀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擎颖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門榛斯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搂捧,你說我怎么就攤上這事驮俗。” “怎么了允跑?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵王凑,是天一觀的道長。 經(jīng)常有香客問我聋丝,道長索烹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任弱睦,我火速辦了婚禮百姓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘每篷。我一直安慰自己瓣戚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布焦读。 她就那樣靜靜地躺著子库,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矗晃。 梳的紋絲不亂的頭發(fā)上仑嗅,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼仓技。 笑死鸵贬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脖捻。 我是一名探鬼主播阔逼,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼地沮!你這毒婦竟也來了嗜浮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤摩疑,失蹤者是張志新(化名)和其女友劉穎危融,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雷袋,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吉殃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了楷怒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛋勺。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖率寡,靈堂內(nèi)的尸體忽然破棺而出迫卢,到底是詐尸還是另有隱情,我是刑警寧澤冶共,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布乾蛤,位于F島的核電站,受9級(jí)特大地震影響捅僵,放射性物質(zhì)發(fā)生泄漏家卖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一庙楚、第九天 我趴在偏房一處隱蔽的房頂上張望上荡。 院中可真熱鬧,春花似錦馒闷、人聲如沸酪捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逛薇。三九已至,卻和暖如春疏虫,著一層夾襖步出監(jiān)牢的瞬間永罚,已是汗流浹背啤呼。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呢袱,地道東北人官扣。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像羞福,于是被迫代替她去往敵國和親惕蹄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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