"

环球体育-【平台】拥有全球最顶尖的原生APP,每天为您提供千场精彩体育赛事,环球体育-【平台】更有真人、彩票、电子老虎机、真人电子竞技游戏等多种娱乐方式选择,环球体育-【平台】让您尽享娱乐、赛事投注等,且无后顾之忧!

"

Qt Model View 簡便類(一)

小編:啊南 77閱讀 2020.12.26

表格、列表和樹型窗口部件是 GUI 開發中經常會用到的窗口部件。傳統的方式是窗口部件本身包含用于存儲數據的內置容器。這種方式非常符合直觀感受,然而,在許多復雜的應用中,這將導致數據的同步問題。早期Qt使用的就是上述的方式。第二種方式是模型/視圖編程,窗口部件無需維護內部的數據容器。它們通過標準的接口獲取外部數據,也因此避免了數據的重復。

提到模型/視圖編程,就不得不說一下Smalltalk語言設計的大數據集可視化方法—模型—視圖—控制器(Model-View-Controller,MVC)。Model(模型)是應用程序中用于處理應用程序數據邏輯的部分。通常模型對象負責在數據庫中存取數據。View(視圖)是應用程序中處理數據顯示的部分。通常視圖是依據模型數據創建的。Controller(控制器)是應用程序中處理用戶交互的部分。通?刂破髫撠煆囊晥D讀取數據,控制用戶輸入,并向模型發送數據。

Qt的Model /View可以理解是對MVC的變形,將MVC中的控制器替換成了稍微有些不同的抽象:委托(delegate)。Qt對每種類型的視圖都提供了默認的委托,這對絕大多數應用程序而言已經足夠了,所以通常我們不需要注意它。

對于Qt的Model /View我們可以簡單的劃分為3種使用級別:

①Model /View的簡便類

②Model /View的預定義模型

③Model /View的自定義模型

簡便類:如QListWidget、QTableWidget、QTreeWidget。

預定義模型:QStringListModel、QStanderItemModel、QFileSystemMode等模型以及數據庫模型。

說了一大堆,也不是很理解。那么接下來我們用一個小例子來了解下Model /View簡便類的使用。

運行環境:ubuntu、 Qt5.5.1

例子是C++ GUI Qt4 改成的Qt5,通過一個對話框顯示用戶可以編輯的(x,y)坐標。

一、構造函數

CoordinateSetter::CoordinateSetter(QList<QPointF> *coords,
                                   QWidget *parent)
    : QDialog(parent)
{
    coordinates = coords;

    tableWidget = new QTableWidget(0, 2);
    tableWidget->setHorizontalHeaderLabels(
            QStringList() << tr("X") << tr("Y"));

    for (int row = 0; row < coordinates->count(); ++row) {
        QPointF point = coordinates->at(row);
        slot_addRow();
        tableWidget->item(row, 0)->setText(QString::number(point.x()));
        tableWidget->item(row, 1)->setText(QString::number(point.y()));
    }

.
.
.
.
.
.
    setWindowTitle(tr("Coordinate Setter"));
}

QTableWidget中每一個項都使用一個QTableWidgetItem表示,slot_addRow()每次都會添加兩個QTableWidgetItem用來顯示坐標x和y,tableWidget->item()->setText()則用來設置QTableWidgetItem的內容。

默認情況下,QTableWidget允許編輯。如果需要防止用戶編輯,可以調用setEditTriggers(QAbstractItemView::NoEditTriggers).

二、slot_addRow()

void CoordinateSetter::slot_addRow()
{
    int row = tableWidget->rowCount();

    tableWidget->insertRow(row);

    QTableWidgetItem *item0 = new QTableWidgetItem;
    item0->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 0, item0);

    QTableWidgetItem *item1 = new QTableWidgetItem;
    item1->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
    tableWidget->setItem(row, 1, item1);

    tableWidget->setCurrentItem(item0);
}

用戶單擊Add Row按鈕時,就會觸發這個槽函數,這種方式在構造函數中也經常使用。我們使用QTableWidget::insertRow()插入一個新行,使用QTableWidgetItem 創建兩個Item,之后使用QTableWidget::setItem()將他們添加到列表中。

三、保存修改

void CoordinateSetter::done(int result)
{
    if (result == QDialog::Accepted) {
        coordinates->clear();
        for (int row = 0; row < tableWidget->rowCount(); ++row) {
            double x = tableWidget->item(row, 0)->text().toDouble();
            double y = tableWidget->item(row, 1)->text().toDouble();
            coordinates->append(QPointF(x, y));
        }
    }
    QDialog::done(result);
}

最后,用戶點擊Ok按鈕時,則會清空傳遞給這個對話框的人坐標,并且根據這個QTableWidget的所有Item創建一個新的坐標集。運行結果如下:

如果將坐標存儲到數據庫,這樣則會有更好的展示效果。以后有機會會結合之前的sqlite再做一次修改。

關聯標簽:
环球体育-【平台】