一、清單控件的使用方法(QListWidget)
QListWidget
負責以清單的形式顯示資料
其中的資料項稱為item,每個item至少包含
1、圖示icon(可選)
2、文本text
3、關聯資料data(可選)
有點像Combox
界面:

添加項:
QListWidgetItem:代表一個資料項
QIcon icon1( "./MyIcon.png" );
ui.ListWidget->addItem( new QListWidgetItem( icon1, "book" ) );
在構造函數裡直接指定icon, text, 此對象由父視窗負責管理,我們在使用時也不需要考慮記憶體的回收問題。
移除項:
可以從清單中将一個資料項移除
//事先用currentRow()方法擷取所選擇的下标
QListWidgetItem* takeItem( int row );
調用該方法,資料項将被移出清單,傳回一個對象,該對象必須手動釋放
(當然,這個對象也可以繼續使用在别的用途)
該對象必須手工删除!
該對象必須手工删除!
該對象必須手工删除!
該對象必須手工删除
效果:
代碼:
class Test12_1a_12_13 : public QMainWindow
{
Q_OBJECT
public:
Test12_1a_12_13(QWidget *parent = Q_NULLPTR);
private:
Ui::Test12_1a_12_13Class ui;
private slots:
int OnBtnRemeve();
int OnBtnSwitchView();
};
///
Test12_1a_12_13::Test12_1a_12_13(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//添加資料項
QIcon icon1("./Resources/Book.png");
ui.listWidget->addItem(new QListWidgetItem(icon1, "book"));
QIcon icon2("./Resources/Heart.png");
ui.listWidget->addItem(new QListWidgetItem(icon2, "Heart"));
QIcon icon3("./Resources/Location.png");
ui.listWidget->addItem(new QListWidgetItem(icon3, " Location"));
assert(connect( ui.btnRemove, SIGNAL(clicked(bool)), this, SLOT(OnBtnRemeve()) ));
assert(connect(ui.btnSwitchView, SIGNAL(clicked(bool)), this, SLOT(OnBtnSwitchView())));
}
//删除按鈕
int Test12_1a_12_13::OnBtnRemeve()
{
//目前的選中項(行号)
int row = ui.listWidget->currentRow();
QListWidgetItem* item = ui.listWidget->takeItem(row);
//手動釋放記憶體
if (item)
{
delete item;
}
return 0;
}
//切換視圖按鈕(圖示方式(平鋪)、清單)
//圖示方式:QListView::IconMode
//清單方式:QListView::ListMode
int Test12_1a_12_13::OnBtnSwitchView()
{
if (ui.listWidget->viewMode() == QListView::ListMode)
{
ui.listWidget->setViewMode(QListView::IconMode);
}
else
{
ui.listWidget->setViewMode(QListView::ListMode);
}
return 0;
}
信号:
常用的信号:單擊和輕按兩下事件
void itemClicked( QListWidgetItem* item );
void itemDoubleClicked( QListWidgetItem* item );
data:
每一項事件都可以關聯很多個data,每個data都有一個id(role),每個role對應一個值(value)
(有點類似STL裡面的 key value )
Qt::UserRole(32)以上都是自定義的role,32以下用于顯示已經規定好的role
(role 和 value 有點類似 K V的關系, 是一一對應的)
二、Model/View構架
Model/View構架(簡單介紹)
在Qt裡,将List,Tree,Table這三種控件統一按照Model/View構架進行設計。
它們的使用方法都是類似的。
Model:
負責管理資料項,統一安排二維表格資料進行管理。
每一行稱為row
每一行内有多個列column
每一項稱為item,每一項的坐标稱為QModelIndex
(清單控件列數為1)
item:
資料項,每個單元格都是一個item,每個item可以關聯多個資料,每個資料用一個role來作為表示。
Qt::DisplayRole(0); //一般對應一個字元串,用于顯示
Qt::UserRole(32); //自定義資料
View : 負責顯示;
三、自定義顯示
四、原位編輯
Test12_4a_12_15::Test12_4a_12_15(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
Additem("book");
Additem("heart");
ui.listWidget->setItemDelegate(new MyDelegate(ui.listWidget));
}
void Test12_4a_12_15::Additem(QString name)
{
QListWidgetItem* item = new QListWidgetItem();
item->setData(Qt::DisplayRole, name);
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable); //注意加上!
ui.listWidget->addItem(item);
}
//第一步:建立一個 widget 作為編輯器
QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QLineEdit* editor = new QLineEdit(parent);
return editor;
}
//第二步:調用編輯器的顯示位置
void MyDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
//第三步:初始化顯示資料
void MyDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QString text = index.data(Qt::DisplayRole).toString();
QLineEdit* ed = (QLineEdit*)editor;
ed->setText(text);
//((QLineEdit*)editor)->setText(text);
}
//第四步:使用者完成編輯、或編輯器被關閉時,提供資料到model
void MyDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QLineEdit* lineEdit = (QLineEdit*)editor;
QString value = lineEdit->text();
model->setData(index, value, Qt::DisplayRole);
}
五、清單控件——右鍵菜單
任務:
給QListWidget添加右鍵支援,點選右鍵的時候,彈出快捷菜單(又稱上下文菜單)
步驟:
1、設定菜單政策 setContextMenuPolicy( Qt::CustomContextMenu );
2、關聯信号 customContextMenuRequested()
3、事件處理(slot):構造菜單、顯示
4、菜單響應(action)
菜單的構造:
QMenu menu;
//這些action事先在Qt Design 中的 Action Editor中添加
menu.addAction(ui.actionAdd);
menu.addAction(ui.actionRemove);
菜單的顯示:
//顯示菜單
menu.exec(ui.listWidget->mapToGlobal(pt));
要把這個QPoint轉換成全局坐标(螢幕坐标)
菜單的上下文:
在構造快捷菜單時,應該根據滑鼠點選的位置(上下文)來定制不同的菜單
比如,當滑鼠點中了一個現有項,則顯示“添加、删除”菜單,
而如果點中的是空白,則彈出菜單中,不應該有“删除”按鈕
六、樹控件 與 表格控件
樹控件(QTreeWidget):
樹控件用于顯示“樹”形的資料,例如檔案樹。
每一項可以用多個列(Column),每一清單示該項的一個屬性
可以在Qt Designer中插入節點,也可以在代碼中手動插入節點
表格(QTableWidget)
表格控件用于顯示“表格”狀的資料,成行、列顯示,
每個單元格是獨立的
補充:這裡介紹的QTreeWidget 和 QTableWidget都是可以實作之前介紹的:
自定義顯示、原位編輯、右鍵菜單、事件處理的,
實作方式均為 Delegate
轉載于:https://blog.51cto.com/zhweizhi/1882956