QT 是一個跨平台,並使用C++作為開發語言的應用程序開發工具,其提供了一套類庫,該類庫實現全平台支持,前面的內容主要學習了基礎組建的使用,下面則是高級組件的使用,QT中的高級組件我把它分為,QListWidget,QTreeWidget,QTableWidget,QGroupBox,MDIArea,DockWidget等,這些組件更加的靈活,下面給則是我總結的學習筆記,供大家參考。
分頁組件與計算器:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ----------------------------------------------------------------------------------
// 全局配置tabWidget選項卡
ui->tabWidget->setTabPosition(QTabWidget::North); // 設置選項卡方位
ui->tabWidget->setIconSize(QSize(50, 25)); // 設置圖標整體大小
ui->tabWidget->setTabShape(QTabWidget::Triangular); // 設置選項卡形狀
ui->tabWidget->setMovable(true); // 設置選項卡是否可拖動
ui->tabWidget->usesScrollButtons(); // 選項卡滾動
// 設置選項卡1
ui->tabWidget->setTabText(0,QString("SpinBox")); // 設置選項卡文本
ui->tabWidget->setTabIcon(0,QIcon(":/image/1.ico")); // 設置選項卡圖標
ui->tabWidget->setTabToolTip(0,QString("SpinBox與進制轉換")); // 設置鼠標懸停提示
// 設置選項卡2
ui->tabWidget->setTabText(1,QString("QSlide")); // 設置選項卡文本
ui->tabWidget->setTabIcon(1,QIcon(":/image/2.ico")); // 設置選項卡圖標
ui->tabWidget->setTabToolTip(1,QString("滑塊條的使用")); // 設置鼠標懸停提示
// 設置選項卡3
ui->tabWidget->setTabText(2,QString("QSlide")); // 設置選項卡文本
ui->tabWidget->setTabIcon(2,QIcon(":/image/3.ico")); // 設置選項卡圖標
ui->tabWidget->setTabToolTip(2,QString("滑塊條的使用")); // 設置鼠標懸停提示
// ----------------------------------------------------------------------------------
// 將選項卡1中,數量和單價兩個SpinBox的valueChanged()信號與on_pushButton_clicked()槽關聯
// 只要spinBox中的內容發生變化,則立即觸發按鈕完成計算
QObject::connect(ui->spinBox,SIGNAL(valueChanged(int)),this,SLOT(on_pushButton_clicked()));
QObject::connect(ui->doubleSpinBox,SIGNAL(valueChanged(double)),this,SLOT(on_pushButton_clicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
// 實現點擊計算按鈕后的計算
void MainWindow::on_pushButton_clicked()
{
int number = ui->spinBox->value(); // 獲取數量
float price = ui->doubleSpinBox->value(); // 獲取單價
float total = number * price; // 計算
ui->doubleSpinBox_2->setValue(total); // 得到結果
}
多選框:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 初始化列表 listWidget
void MainWindow::on_pushButton_clicked()
{
// 每一行是一個QListWidgetItem
QListWidgetItem *aItem;
// 設置ICON的圖標
QIcon aIcon;
aIcon.addFile(":/image/1.ico");
ui->listWidget->clear();
for(int x=0;x<10;x++)
{
QString str = QString::asprintf("192.168.1.%d",x);
aItem = new QListWidgetItem(); // 新建一個項
aItem->setText(str); // 設置文字標簽
aItem->setIcon(aIcon); // 設置圖標
aItem->setCheckState(Qt::Checked); // 設為選中狀態
aItem->setFlags(Qt::ItemIsSelectable | // 設置為不可編輯狀態
Qt::ItemIsUserCheckable
|Qt::ItemIsEnabled);
ui->listWidget->addItem(aItem); //增加項
}
}
// 設置所有項設置為可編輯狀態
void MainWindow::on_pushButton_5_clicked()
{
int x,cnt;
QListWidgetItem *aItem;
cnt = ui->listWidget->count();
for(x=0;x<cnt;x++)
{
aItem = ui->listWidget->item(x);
aItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable
|Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
}
}
// 全選按鈕
void MainWindow::on_pushButton_2_clicked()
{
int cnt = ui->listWidget->count(); // 獲取總數
for(int x=0;x<cnt;x++)
{
QListWidgetItem *aItem = ui->listWidget->item(x); // 獲取到一項指針
aItem->setCheckState(Qt::Checked); // 設置為選中
}
}
// 全不選
void MainWindow::on_pushButton_3_clicked()
{
int cnt = ui->listWidget->count(); // 獲取總數
for(int x=0;x<cnt;x++)
{
QListWidgetItem *aItem = ui->listWidget->item(x); // 獲取到一項指針
aItem->setCheckState(Qt::Unchecked); // 設置為非選中
}
}
// 反選
void MainWindow::on_pushButton_4_clicked()
{
int x,cnt;
QListWidgetItem *aItem;
cnt = ui->listWidget->count();
for(x=0;x<cnt;x++)
{
aItem = ui->listWidget->item(x);
if(aItem->checkState() != Qt::Checked)
aItem->setCheckState(Qt::Checked);
else
aItem->setCheckState(Qt::Unchecked);
}
}
// 刪除選中項
void MainWindow::on_pushButton_6_clicked()
{
int row = ui->listWidget->currentRow(); // 獲取當前行
QListWidgetItem *aItem = ui->listWidget->takeItem(row); // 移除指定行的項,但不delete
delete aItem; // 釋放空間
}
// 增加一項,尾部追加
void MainWindow::on_pushButton_7_clicked()
{
QIcon aIcon;
aIcon.addFile(":/image/2.ico");
QListWidgetItem *aItem = new QListWidgetItem("新增的項目"); // 增加項目名
aItem->setIcon(aIcon); // 設置圖標
aItem->setCheckState(Qt::Checked); // 設置為選中
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
ui->listWidget->addItem(aItem); // 增加到控件
}
// 指定位置插入一項
void MainWindow::on_pushButton_8_clicked()
{
QIcon aIcon;
aIcon.addFile(":/image/3.ico");
QListWidgetItem *aItem = new QListWidgetItem("插入的數據");
aItem->setIcon(aIcon);
aItem->setCheckState(Qt::Checked);
aItem->setFlags(Qt::ItemIsSelectable |Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
// 在當前行的上方插入一個項
ui->listWidget->insertItem(ui->listWidget->currentRow(),aItem);
}
// listWidget當前選中項發生變化
void MainWindow::on_listWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
{
QString str;
if (current != NULL) //需要檢測變量指針是否為空
{
if (previous==NULL) //需要檢測變量指針是否為空
str="當前:"+current->text();
else
str="前一項:" + previous->text() + "; 當前項:" + current->text();
std::cout << str.toStdString().data() << std::endl;
}
}
// 當右鍵被點擊時彈出菜單
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
}
為多選框增加右鍵菜單:
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <iostream>
// 全局下設置增加刪除菜單
QAction *NewAction;
QAction *InsertAction;
QAction *DeleteAction;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 使用 customContextMenuRequested 信號則需要設置
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 隱藏菜單欄上的右擊菜單
this->setContextMenuPolicy(Qt::NoContextMenu);
// 創建基礎頂部菜單
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("菜單1");
// 添加子菜單
NewAction = fileMenu->addAction("增加IP地址");
InsertAction = fileMenu->addAction("插入IP地址");
DeleteAction = fileMenu->addAction("刪除IP地址");
// 分別設置圖標
NewAction->setIcon(QIcon(":/image/1.ico"));
InsertAction->setIcon(QIcon(":/image/2.ico"));
DeleteAction->setIcon(QIcon(":/image/3.ico"));
// 綁定槽函數
connect(NewAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
});
connect(InsertAction,&QAction::triggered,this,[=](){
std::cout << "insert action" << std::endl;
});
// 以刪除為例,演示如何刪除選中行
connect(DeleteAction,&QAction::triggered,this,[=](){
int row = ui->listWidget->currentRow();
QListWidgetItem *aItem = ui->listWidget->takeItem(row);
delete aItem;
std::cout << "delete action" << std::endl;
});
}
MainWindow::~MainWindow()
{
delete ui;
}
// 當listWidget被右鍵點擊時則觸發
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
Q_UNUSED(pos);
// 新建Menu菜單
QMenu *ptr = new QMenu(this);
// 添加Actions創建菜單項
ptr->addAction(NewAction);
ptr->addAction(InsertAction);
// 添加一個分割線
ptr->addSeparator();
ptr->addAction(DeleteAction);
// 在鼠標光標位置顯示右鍵快捷菜單
ptr->exec(QCursor::pos());
// 手工創建的指針必須手工刪除
delete ptr;
}
多選框的圖標模式:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QToolBar>
#include <iostream>
// 全局下設置增加刪除菜單
QAction *NewAction;
QAction *InsertAction;
QAction *DeleteAction;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 使用 customContextMenuRequested 信號則需要設置
ui->listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 隱藏菜單欄上的右擊菜單
this->setContextMenuPolicy(Qt::NoContextMenu);
// 創建基礎頂部菜單
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("菜單1");
bar->setVisible(false); // 隱藏頂部菜單欄
// 添加子菜單
NewAction = fileMenu->addAction("增加IP地址");
InsertAction = fileMenu->addAction("插入IP地址");
DeleteAction = fileMenu->addAction("刪除IP地址");
// 分別設置圖標
NewAction->setIcon(QIcon(":/image/1.ico"));
InsertAction->setIcon(QIcon(":/image/2.ico"));
DeleteAction->setIcon(QIcon(":/image/3.ico"));
// 綁定槽函數
connect(NewAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
});
connect(InsertAction,&QAction::triggered,this,[=](){
std::cout << "insert action" << std::endl;
});
// 以刪除為例,演示如何刪除選中行
connect(DeleteAction,&QAction::triggered,this,[=](){
int row = ui->listWidget->currentRow();
QListWidgetItem *aItem = ui->listWidget->takeItem(row);
delete aItem;
std::cout << "delete action" << std::endl;
});
// 第二個ListWidget_使用圖標方式展示
ui->listWidget_2->setViewMode(QListView::IconMode);
// 每一行是一個QListWidgetItem
QListWidgetItem *aItem;
// 設置ICON的圖標
QIcon aIcon;
aIcon.addFile(":/image/1.ico");
ui->listWidget_2->clear();
for(int x=0;x<10;x++)
{
QString str = QString::asprintf("admin_%d",x);
aItem = new QListWidgetItem(); // 新建一個項
aItem->setText(str); // 設置文字標簽
aItem->setIcon(aIcon); // 設置圖標
//aItem->setCheckState(Qt::Checked); // 設為選中狀態
aItem->setFlags(Qt::ItemIsSelectable | // 設置為不可編輯狀態
Qt::ItemIsUserCheckable
|Qt::ItemIsEnabled);
ui->listWidget_2->addItem(aItem); //增加項
}
}
MainWindow::~MainWindow()
{
delete ui;
}
// 當listWidget被右鍵點擊時則觸發
void MainWindow::on_listWidget_customContextMenuRequested(const QPoint &pos)
{
std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
Q_UNUSED(pos);
// 新建Menu菜單
QMenu *ptr = new QMenu(this);
// 添加Actions創建菜單項
ptr->addAction(NewAction);
ptr->addAction(InsertAction);
// 添加一個分割線
ptr->addSeparator();
ptr->addAction(DeleteAction);
// 在鼠標光標位置顯示右鍵快捷菜單
ptr->exec(QCursor::pos());
// 手工創建的指針必須手工刪除
delete ptr;
}
treeWidget 實現的輸出,與右鍵菜單實現
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QIcon>
#include <QString>
// 全局下設置增加刪除菜單
QAction *NewAction;
QAction *InsertAction;
QAction *DeleteAction;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
// 創建基礎頂部菜單
QMenuBar *bar = menuBar();
this->setMenuBar(bar);
QMenu * fileMenu = bar->addMenu("菜單1");
// 添加子菜單
NewAction = fileMenu->addAction("獲取行號");
InsertAction = fileMenu->addAction("獲取本行數據");
DeleteAction = fileMenu->addAction("刪除IP地址");
// 分別設置圖標
NewAction->setIcon(QIcon(":/image/1.ico"));
InsertAction->setIcon(QIcon(":/image/2.ico"));
DeleteAction->setIcon(QIcon(":/image/3.ico"));
// 綁定槽函數
connect(NewAction,&QAction::triggered,this,[=](){
std::cout << "new action" << std::endl;
int row = ui->treeWidget->currentColumn();
std::cout << row << std::endl;
});
connect(InsertAction,&QAction::triggered,this,[=](){
std::cout << "insert action" << std::endl;
QString msg = ui->treeWidget->currentItem()->text(0);
std::cout << msg.toStdString().data() << std::endl;
});
// 獲得行號
connect(DeleteAction,&QAction::triggered,this,[=](){
std::cout << "delete action" << std::endl;
int row = ui->treeWidget->currentIndex().row();
std::cout << row << std::endl;
});
ui->treeWidget->setColumnCount(4);
ui->treeWidget->setColumnWidth(0,200);
QTreeWidgetItem* item=new QTreeWidgetItem();
item->setText(0,"<Frist Lyshark>");
item->setIcon(0,QIcon(":/image/3.ico"));
item->setText(1,"2020-12-11");
item->setText(2,"*.pdf");
item->setText(3,"102MB");
ui->treeWidget->addTopLevelItem(item);
QTreeWidgetItem* item1=new QTreeWidgetItem();
item1->setText(0,"<Frist wang>");
item1->setIcon(0,QIcon(":/image/3.ico"));
item1->setText(1,"2010-11-11");
item1->setText(2,"*.pdf");
item1->setText(3,"12MB");
ui->treeWidget->addTopLevelItem(item1);
QStringList headers;
headers.append("文件名");
headers.append("更新時間");
headers.append("文件類型");
headers.append("文件大小");
ui->treeWidget->setHeaderLabels(headers);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_treeWidget_customContextMenuRequested(const QPoint &pos)
{
std::cout << "x pos = "<< pos.x() << "y pos = " << pos.y() << std::endl;
Q_UNUSED(pos);
// 新建Menu菜單
QMenu *ptr = new QMenu(this);
// 添加Actions創建菜單項
ptr->addAction(NewAction);
ptr->addAction(InsertAction);
// 添加一個分割線
ptr->addSeparator();
ptr->addAction(DeleteAction);
// 在鼠標光標位置顯示右鍵快捷菜單
ptr->exec(QCursor::pos());
// 手工創建的指針必須手工刪除
delete ptr;
}
tree的多節點並駕齊驅
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->clear();
// 設置QTreeWidget的列數
ui->treeWidget->setColumnCount(1);
// 設置QTreeWidget標題隱藏
ui->treeWidget->setHeaderHidden(true);
// 創建QTreeWidget的朋友節點,父節點是tree
QTreeWidgetItem *Friend = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("朋友")));
Friend->setIcon(0,QIcon(":/image/4.ico")); // 添加一個圖標
Friend->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable
| Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
Friend->setCheckState(0,Qt::Checked); // 設置為選中
// 給Friend添加一個子節點frd
QTreeWidgetItem *frd = new QTreeWidgetItem(Friend);
frd->setText(0,"老張");
frd->setIcon(0,QIcon(tr(":/image/1.ico")));
QTreeWidgetItem *frs = new QTreeWidgetItem(Friend);
frs->setText(0,"老王");
frs->setIcon(0,QIcon(tr(":/image/1.ico")));
// ----------------------------------------------------------
// 創建名叫同學節點,父節點同樣是tree
QTreeWidgetItem * ClassMate = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("同學")));
ClassMate->setIcon(0,QIcon(":/image/5.ico")); // 添加一個圖標
//Fly是ClassMate的子節點
QTreeWidgetItem *Fly = new QTreeWidgetItem(QStringList(QString("張三")));
Fly->setIcon(0,QIcon(tr(":/image/2.ico")));
//創建子節點的另一種方法
ClassMate->addChild(Fly);
QTreeWidgetItem *Fls = new QTreeWidgetItem(QStringList(QString("李四")));
Fls->setIcon(0,QIcon(tr(":/image/2.ico")));
ClassMate->addChild(Fls);
// ----------------------------------------------------------
// 陌生人單獨一欄
QTreeWidgetItem *Strange = new QTreeWidgetItem(true);
Strange->setText(0,"陌生人");
Strange->setIcon(0,QIcon(":/image/6.ico")); // 添加一個圖標
ui->treeWidget->addTopLevelItem(ClassMate);
ui->treeWidget->addTopLevelItem(Strange);
//展開QTreeWidget的所有節點
//ui->treeWidget->expandAll();
//ui->treeWidget->resize(271,401);
}
MainWindow::~MainWindow()
{
delete ui;
}
QTreeWidgetItem * MainWindow::AddTreeRoot(QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
ui->treeWidget->addTopLevelItem(item);
return item;
}
QTreeWidgetItem * MainWindow::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
parent->addChild(item);
return item;
}
// 當我們雙擊指定的成員時獲取到該成員的名字
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
QString str = item->text(column);
std::cout << str.toStdString().data() << std::endl;
}
// 當我們單擊指定成員時獲取數據
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
QString str = item->text(column);
std::cout << str.toStdString().data() << std::endl;
}
// 單擊按鈕添加新的父節點
void MainWindow::on_pushButton_clicked()
{
QString NodeText = "新的父節點";
QTreeWidgetItem *item = new QTreeWidgetItem(true);
item->setText(0,NodeText);
item->setIcon(0,QIcon(":/image/7.ico"));
ui->treeWidget->addTopLevelItem(item);
}
// 單擊按鈕添加子節點
void MainWindow::on_pushButton_4_clicked()
{
QTreeWidgetItem * item= ui->treeWidget->currentItem();
if(item!=NULL)
AddTreeNode(item,"新子節點","新子節點");
else
AddTreeRoot("新子節點","新子節點");
}
// 單擊后將指定節點修改為Modify並將圖標設置為新的
void MainWindow::on_pushButton_2_clicked()
{
// 得到當前節點
QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
return;
// 修改選中項
for(int x=0;x<currentItem->columnCount();x++)
{
currentItem->setText(x,tr("Modify") + QString::number(x));
currentItem->setIcon(x,QIcon(":/image/1.ico"));
}
}
// 刪除選中的節點
void MainWindow::on_pushButton_3_clicked()
{
QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
return;
// 如果沒有父節點則直接刪除
if(currentItem->parent() == NULL)
{
delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
std::cout << ui->treeWidget->currentIndex().row() << std::endl;
}
else
{
// 如果有父節點就要用父節點的takeChild刪除節點
delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
}
}
針對上方代碼的完善
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->clear();
// 設置QTreeWidget的列數
ui->treeWidget->setColumnCount(1);
// 設置QTreeWidget標題隱藏
ui->treeWidget->setHeaderHidden(true);
// 創建QTreeWidget的朋友節點,父節點是tree
QTreeWidgetItem *Friend = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("朋友")));
Friend->setIcon(0,QIcon(":/image/4.ico")); // 添加一個圖標
Friend->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable
| Qt::ItemIsEnabled | Qt::ItemIsAutoTristate);
// 給Friend添加一個子節點frd
QTreeWidgetItem *frd = new QTreeWidgetItem(Friend);
frd->setText(0,"老張");
frd->setIcon(0,QIcon(tr(":/image/1.ico")));
frd->setCheckState(0,Qt::Checked);
QTreeWidgetItem *frs = new QTreeWidgetItem(Friend);
frs->setText(0,"老王");
frs->setIcon(0,QIcon(tr(":/image/1.ico")));
frs->setCheckState(0,Qt::Unchecked);
// ----------------------------------------------------------
// 創建名叫同學節點,父節點同樣是tree
QTreeWidgetItem * ClassMate = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("同學")));
ClassMate->setIcon(0,QIcon(":/image/5.ico")); // 添加一個圖標
//Fly是ClassMate的子節點
QTreeWidgetItem *Fly = new QTreeWidgetItem(QStringList(QString("張三")));
Fly->setIcon(0,QIcon(tr(":/image/2.ico")));
//創建子節點的另一種方法
ClassMate->addChild(Fly);
QTreeWidgetItem *Fls = new QTreeWidgetItem(QStringList(QString("李四")));
Fls->setIcon(0,QIcon(tr(":/image/2.ico")));
ClassMate->addChild(Fls);
// ----------------------------------------------------------
// 陌生人單獨一欄
QTreeWidgetItem *Strange = new QTreeWidgetItem(true);
Strange->setText(0,"陌生人");
Strange->setIcon(0,QIcon(":/image/6.ico")); // 添加一個圖標
ui->treeWidget->addTopLevelItem(ClassMate);
ui->treeWidget->addTopLevelItem(Strange);
//展開QTreeWidget的所有節點
//ui->treeWidget->expandAll();
//ui->treeWidget->resize(271,401);
}
MainWindow::~MainWindow()
{
delete ui;
}
QTreeWidgetItem * MainWindow::AddTreeRoot(QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
ui->treeWidget->addTopLevelItem(item);
return item;
}
QTreeWidgetItem * MainWindow::AddTreeNode(QTreeWidgetItem *parent,QString name,QString desc)
{
QTreeWidgetItem * item=new QTreeWidgetItem(QStringList()<<name<<desc);
parent->addChild(item);
return item;
}
// 當我們雙擊指定的成員時獲取到該成員的名字
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
QString str = item->text(column);
std::cout << str.toStdString().data() << std::endl;
}
// 當我們單擊指定成員時獲取數據
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
QString str = item->text(column);
std::cout << str.toStdString().data() << std::endl;
}
// 單擊按鈕添加新的父節點
void MainWindow::on_pushButton_clicked()
{
QString NodeText = "新的父節點";
QTreeWidgetItem *item = new QTreeWidgetItem(true);
item->setText(0,NodeText);
item->setIcon(0,QIcon(":/image/7.ico"));
ui->treeWidget->addTopLevelItem(item);
}
// 單擊按鈕添加子節點
void MainWindow::on_pushButton_4_clicked()
{
QTreeWidgetItem * item= ui->treeWidget->currentItem();
if(item!=NULL)
AddTreeNode(item,"新子節點","新子節點");
else
AddTreeRoot("新子節點","新子節點");
}
// 單擊后將指定節點修改為Modify並將圖標設置為新的
void MainWindow::on_pushButton_2_clicked()
{
// 得到當前節點
QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
return;
// 修改選中項
for(int x=0;x<currentItem->columnCount();x++)
{
currentItem->setText(x,tr("Modify") + QString::number(x));
currentItem->setIcon(x,QIcon(":/image/1.ico"));
}
}
// 刪除選中的節點
void MainWindow::on_pushButton_3_clicked()
{
QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();
if(currentItem == NULL)
return;
// 如果沒有父節點則直接刪除
if(currentItem->parent() == NULL)
{
delete ui->treeWidget->takeTopLevelItem(ui->treeWidget->currentIndex().row());
std::cout << ui->treeWidget->currentIndex().row() << std::endl;
}
else
{
// 如果有父節點就要用父節點的takeChild刪除節點
delete currentItem->parent()->takeChild(ui->treeWidget->currentIndex().row());
}
}
// 枚舉所有節點
void MainWindow::on_pushButton_5_clicked()
{
// 獲取到全部的根節點數量
int size = ui->treeWidget->topLevelItemCount();
QTreeWidgetItem *child;
for(int x=0;x<size;x++)
{
// 輸出所有父節點
child = ui->treeWidget->topLevelItem(x);
std::cout << "all root = "<< child->text(0).toStdString().data() << std::endl;
// 得到所有子節點計數
int childCount = child->childCount();
// std::cout << "all child count = " << childCount << std::endl;
// 輸出根節點下面的子節點
for(int y=0;y<childCount;++y)
{
QTreeWidgetItem *grandson = child->child(y);
if(Qt::Checked == grandson->checkState(0))
{
std::cout << "--> sub child = "<< grandson->text(0).toStdString().data() << std::endl;
}
}
}
}
// 獲取子節點的父節點ID,然后根據ID得到子節點名字
void MainWindow::on_pushButton_6_clicked()
{
// 取所有的父節點
QTreeWidgetItem *currentItem = ui->treeWidget->currentItem()->parent();
int root_count = ui->treeWidget->indexOfTopLevelItem(currentItem);
std::cout << "root Count = " << root_count << std::endl;
if(root_count != -1)
{
// 指定序號對應的父節點名字
QTreeWidgetItem *child;
child = ui->treeWidget->topLevelItem(root_count);
std::cout << "root name= "<< child->text(0).toStdString().data() << std::endl;
}
}
圖片組件的使用
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->treeWidget->clear();
// 添加表頭
QStringList headers;
headers.append("文件名稱");
headers.append("完整路徑");
ui->treeWidget->setHeaderLabels(headers);
// 設置treeWidget屬性
ui->treeWidget->setColumnCount(2); // 設置總列數
ui->treeWidget->setIndentation(1); // 設置表頭縮進為1
ui->label->setAlignment(Qt::AlignCenter); // 設置label居中顯示
}
MainWindow::~MainWindow()
{
delete ui;
}
// 從一個完整目錄名稱里,獲得最后的文件夾名稱
QString MainWindow::getFinalFolderName(const QString &fullPathName)
{
int cnt=fullPathName.length(); // 字符串長度
int i=fullPathName.lastIndexOf("/"); // 最后一次出現的位置
QString str=fullPathName.right(cnt-i-1); // 獲得最后的文件夾的名稱
return str;
}
// 添加一個子節點
void MainWindow::addImageItem(QString RelativePathName, QString FullPathName)
{
QString NodeText=getFinalFolderName(FullPathName); //獲得最后的文件名稱
QTreeWidgetItem *item; //節點
// 新創建一個子節點
item=new QTreeWidgetItem();
item->setIcon(0,QIcon(":/image/1.ico"));
item->setText(0,RelativePathName);
item->setText(1,FullPathName);
// 設置節點Qt::UserRole的Data,存儲完整文件名稱 需要注意我們存儲的是1這個節點
// 也就是完整路徑中的內容,提取時也應該指定為1節點
item->setData(0,Qt::UserRole,QVariant(RelativePathName));
item->setData(1,Qt::UserRole,QVariant(FullPathName));
ui->treeWidget->addTopLevelItem(item);
}
// 點擊按鈕批量導入圖片資源
void MainWindow::on_pushButton_clicked()
{
// 選擇一個文件或多個
QStringList file = QFileDialog::getOpenFileNames(this,"選擇一個或多個文件","","Images(*.jpg)");
// 判斷是否為空,為空則返回
if(file.isEmpty())
return;
// 循環添加新節點
for(int x=0;x<file.size();++x)
{
QString FullPathName = file.at(x);
QString RelativePathName = getFinalFolderName(FullPathName);
std::cout << FullPathName.toStdString().data() << std::endl;
std::cout << RelativePathName.toStdString().data() << std::endl;
addImageItem(RelativePathName,FullPathName);
}
}
// 點擊按鈕測試獲取圖片路徑
void MainWindow::on_pushButton_2_clicked()
{
QTreeWidgetItem* parItem=ui->treeWidget->currentItem(); //當前節點
// 獲取節點data里存的文件名,由於設置的是1節點,所以提取是必須也為1
QString FullPathName = parItem->data(1,Qt::UserRole).toString();
std::cout << "Full Name => " << FullPathName.toStdString().data() << std::endl;
QString RelativePathName = parItem->data(0,Qt::UserRole).toString();
std::cout << "Relative Name => " << RelativePathName.toStdString().data() << std::endl;
}
// 自適應顯示圖片
void MainWindow::on_actZoomFitH_triggered()
{
// 自適應高度調整
int H=ui->scrollArea->height(); // 得到scrollArea的高度
int realH=curPixmap.height(); // 原始圖片的實際高度
pixRatio=float(H)/realH; // 當前顯示比例,必須轉換為浮點數
QPixmap pix_height = curPixmap.scaledToHeight(H-30); // 圖片縮放到指定高度
//適應寬度顯示
int w=ui->scrollArea->width()-20; // 得到scrollArea的高度
int realw=curPixmap.width(); // 原始圖片的實際寬度
pixRatio=float(w)/realw; // 當前顯示比例,必須轉換為浮點數
QPixmap pix_width = curPixmap.scaledToWidth(w-30);
// 顯示到標簽中
ui->label->setPixmap(pix_height); // 設置Label的PixMap 按高度調整
//ui->label->setPixmap(pix_width); // 按寬度調整
}
// 當圖片被選中時默認自適應顯示
void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
QString FilePath = item->data(column,Qt::UserRole).toString();
std::cout << "FilePath = " << FilePath.toStdString().data() << std::endl;
curPixmap.load(FilePath);
on_actZoomFitH_triggered();
}
// 放大圖片
void MainWindow::on_pushButton_3_clicked()
{
pixRatio=pixRatio*1.2;//在當前比例基礎上乘以0.8
int w=pixRatio*curPixmap.width();// 顯示寬度
int h=pixRatio*curPixmap.height();//顯示高度
QPixmap pix=curPixmap.scaled(w,h);//圖片縮放到指定高度和寬度,保持長寬比例
ui->label->setPixmap(pix);
}
// 縮小圖片
void MainWindow::on_pushButton_4_clicked()
{
pixRatio=pixRatio*0.8; //在當前比例基礎上乘以0.8
int w=pixRatio*curPixmap.width();// 顯示寬度
int h=pixRatio*curPixmap.height();//顯示高度
QPixmap pix=curPixmap.scaled(w,h); //圖片縮放到指定高度和寬度,保持長寬比例
ui->label->setPixmap(pix);
}
// 恢復默認值
void MainWindow::on_pushButton_5_clicked()
{
pixRatio=1; //恢復顯示比例為1
ui->label->setPixmap(curPixmap);
}
底部狀態欄統計信息的添加 默認QT會生成,我們需要手動初始化一下即可使用。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化狀態欄
labCellIndex = new QLabel("當前坐標: ",this);
labCellIndex->setMinimumWidth(250);
labCellType=new QLabel("單元格類型: ",this);
labCellType->setMinimumWidth(200);
labStudID=new QLabel("學生ID: ",this);
labStudID->setMinimumWidth(200);
// 將初始化的標簽添加到底部狀態欄上
ui->statusbar->addWidget(labCellIndex);
ui->statusbar->addWidget(labCellType);
ui->statusbar->addWidget(labStudID);
}
// 當前選擇單元格發生變化時觸發響應事件,也就是將底部狀態欄標簽設置
void MainWindow::on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
Q_UNUSED(previousRow);
Q_UNUSED(previousColumn);
// 顯示行與列的變化數值
std::cout << "currentRow = " << currentRow << " currentColumn = " << currentColumn << std::endl;
std::cout << "pre Row = " << previousRow << " pre Column = " << previousColumn << std::endl;
// 獲取當前單元格的Item
QTableWidgetItem *item = ui->tableWidget->item(currentRow,currentColumn);
std::cout << item << std::endl;
if(item == NULL)
return;
// 設置單元格坐標
labCellIndex->setText(QString::asprintf("當前坐標: %d 行 | %d 列",currentRow,currentColumn));
// 設置單元格類型
int cellType = item->type();
labCellType->setText(QString::asprintf("單元格類型: %d",cellType));
}
循環設置表頭元素
// 設置表頭的實現
void MainWindow::on_pushButton_clicked()
{
QTableWidgetItem *headerItem;
QStringList headerText_Row,headerText_Col;
headerText_Row << "姓 名" << "性 別" << "出生日期" << "民 族" << "分數" << "是否黨員";
headerText_Col << "第一行" << "第二行";
// 設置為水平表頭
ui->tableWidget->setHorizontalHeaderLabels(headerText_Row);
// 設置垂直表頭
ui->tableWidget->setVerticalHeaderLabels(headerText_Col);
// 另一種方式: 通過循環設置
ui->tableWidget->setColumnCount(headerText_Row.count()); // 列數設置為與headerText的行數相等
for (int i=0;i<ui->tableWidget->columnCount();i++) // 列編號從0開始
{
headerItem=new QTableWidgetItem(headerText_Row.at(i)); // headerText.at(i) 獲取headerText的i行字符串
QFont font=headerItem->font(); // 獲取原有字體設置
font.setBold(true); // 設置為粗體
font.setPointSize(8); // 設置字體大小
headerItem->setTextColor(Qt::black); // 設置字體顏色
headerItem->setFont(font); // 設置字體
ui->tableWidget->setHorizontalHeaderItem(i,headerItem); // 設置表頭單元格的Item
}
}
設置初始化表格,行選擇,列選擇,單元格選擇。
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->tableWidget->clear();
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
// 初始化狀態欄
labCellIndex = new QLabel("當前坐標: ",this);
labCellIndex->setMinimumWidth(250);
labCellType=new QLabel("單元格類型: ",this);
labCellType->setMinimumWidth(200);
labStudID=new QLabel("學生ID: ",this);
labStudID->setMinimumWidth(200);
// 將初始化的標簽添加到底部狀態欄上
ui->statusbar->addWidget(labCellIndex);
ui->statusbar->addWidget(labCellType);
ui->statusbar->addWidget(labStudID);
}
// 當前選擇單元格發生變化時觸發響應事件,也就是將底部狀態欄標簽設置
void MainWindow::on_tableWidget_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
Q_UNUSED(previousRow);
Q_UNUSED(previousColumn);
// 顯示行與列的變化數值
std::cout << "currentRow = " << currentRow << " currentColumn = " << currentColumn << std::endl;
std::cout << "pre Row = " << previousRow << " pre Column = " << previousColumn << std::endl;
// 獲取當前單元格的Item
QTableWidgetItem *item = ui->tableWidget->item(currentRow,currentColumn);
std::cout << item << std::endl;
if(item == NULL)
return;
// 設置單元格坐標
labCellIndex->setText(QString::asprintf("當前坐標: %d 行 | %d 列",currentRow,currentColumn));
// 設置單元格類型
int cellType = item->type();
labCellType->setText(QString::asprintf("單元格類型: %d",cellType));
}
MainWindow::~MainWindow()
{
delete ui;
}
// 設置表頭的實現
void MainWindow::on_pushButton_clicked()
{
QTableWidgetItem *headerItem;
QStringList headerText_Row,headerText_Col;
headerText_Row << "姓 名" << "性 別" << "出生日期" << "民 族" << "分數" << "是否黨員";
headerText_Col << "第一行" << "第二行";
// 設置為水平表頭
ui->tableWidget->setHorizontalHeaderLabels(headerText_Row);
// 設置垂直表頭
//ui->tableWidget->setVerticalHeaderLabels(headerText_Col);
// 另一種方式: 通過循環設置
ui->tableWidget->setColumnCount(headerText_Row.count()); // 列數設置為與headerText的行數相等
for (int i=0;i<ui->tableWidget->columnCount();i++) // 列編號從0開始
{
headerItem=new QTableWidgetItem(headerText_Row.at(i)); // headerText.at(i) 獲取headerText的i行字符串
QFont font=headerItem->font(); // 獲取原有字體設置
font.setBold(true); // 設置為粗體
font.setPointSize(8); // 設置字體大小
headerItem->setTextColor(Qt::black); // 設置字體顏色
headerItem->setFont(font); // 設置字體
ui->tableWidget->setHorizontalHeaderItem(i,headerItem); // 設置表頭單元格的Item
}
}
// 從spinBox中讀出數量,並設置TableWidget表格的行數
void MainWindow::on_pushButton_2_clicked()
{
// 讀取出spinBox中的數據,並將其設置到表格中
ui->tableWidget->setRowCount(ui->spinBox->value());
// 行的底色交替采用不同顏色
ui->tableWidget->setAlternatingRowColors(true);
}
// 設置表格是否可編輯
void MainWindow::on_checkBox_clicked(bool checked)
{
if (checked)
ui->tableWidget->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);
else
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //不允許編輯
}
// 行的底色交替采用不同顏色
void MainWindow::on_checkBox_2_clicked(bool checked)
{
ui->tableWidget->setAlternatingRowColors(checked);
}
// 顯示水平表頭
void MainWindow::on_checkBox_3_clicked(bool checked)
{
ui->tableWidget->horizontalHeader()->setVisible(checked);
}
// 顯示垂直表頭
void MainWindow::on_checkBox_4_clicked(bool checked)
{
ui->tableWidget->verticalHeader()->setVisible(checked);
}
// 設置為單元格選擇
void MainWindow::on_radioButton_clicked()
{
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems);
}
// 設置為行選擇
void MainWindow::on_radioButton_2_clicked()
{
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
}
table表單的另一種嘗試:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
QStringList header;
header << "姓名" << "性別" << "年齡";
ui->tableWidget->setColumnCount(header.size()); // 設置表格的列數
ui->tableWidget->setHorizontalHeaderLabels(header); // 設置水平頭
ui->tableWidget->setRowCount(5); // 設置總行數
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); // 設置表結構默認不可編輯
// 初始化右側的編輯框等屬性
ui->radioButton->setChecked(true);
ui->lineEdit_1->setText("");
ui->lineEdit_2->setText("");
// 填充數據
QStringList NameList;
NameList << "張三" << "李四" << "王五";
QStringList SexList;
SexList << "男" << "男" << "女";
qint32 AgeList[3] = {22,23,43};
// 針對獲取元素使用 NameList[x] 和使用 NameList.at(x)效果相同
for(int x=0;x< 3;x++)
{
int col =0;
// 添加姓名
ui->tableWidget->setItem(x,col++,new QTableWidgetItem(NameList[x]));
// 添加性別
ui->tableWidget->setItem(x,col++,new QTableWidgetItem(SexList.at(x)));
// 添加年齡
ui->tableWidget->setItem(x,col++,new QTableWidgetItem( QString::number(AgeList[x]) ) );
}
// 給添加按鈕綁定一個信號槽,點擊按鈕添加
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString Uname = ui->lineEdit_1->text();
QString Usex = "男";
int Uage = 0;
if(ui->radioButton->isChecked())
Usex = "男";
if(ui->radioButton_2->isChecked())
Usex = "女";
Uage =(ui->lineEdit_2->text()).toInt();
// 添加之前,先判斷Uname是否存在於TableWidget中,如果存在返回0不存在返回1
bool isEmpty = ui->tableWidget->findItems(Uname,Qt::MatchExactly).empty();
if(isEmpty)
{
ui->tableWidget->insertRow(0); // 在行首添加一行空列表
ui->tableWidget->setItem(0,0,new QTableWidgetItem(Uname));
ui->tableWidget->setItem(0,1,new QTableWidgetItem(Usex));
ui->tableWidget->setItem(0,2,new QTableWidgetItem( QString::number(Uage)));
}
});
// 點擊按鈕刪除選中行
connect(ui->pushButton_2,&QPushButton::clicked,[=](){
bool isEmpty = ui->tableWidget->findItems(ui->lineEdit_1->text(),Qt::MatchExactly).empty();
if(!isEmpty)
{
// 定位到所在行行號
int row = ui->tableWidget->findItems(ui->lineEdit_1->text(),Qt::MatchExactly).first()->row();
// 釋放資源
ui->tableWidget->removeRow(row);
}
});
// 獲取當前選中單元,並釋放當前單格
connect(ui->pushButton_3,&QPushButton::clicked,[=](){
int row = ui->tableWidget->currentRow();
std::cout << row << std::endl;
QTableWidgetItem *table = ui->tableWidget->currentItem();
delete(table);
});
// 添加修改指定內容的處理流程
connect(ui->pushButton_4,&QPushButton::clicked,[=](){
QTableWidgetItem *cellItem;
// 取出當前選中行
int curr_row = ui->tableWidget->currentRow();
// 循環列數
for(int col=0; col<ui->tableWidget->columnCount(); col++)
{
// 尋找到當前列的指針
cellItem = ui->tableWidget->item(curr_row,col);
// 循環輸出列名稱
std::cout << cellItem->text().toStdString().data() << std::endl;
// 先來處理第一個姓名,讀出來並寫回到列表第0列
if(col == 0)
cellItem->setText(ui->lineEdit_1->text());
// 判斷性別,並分別寫回到第1列
if(col == 1)
{
if(ui->radioButton->isChecked())
cellItem->setText("男");
if(ui->radioButton_2->isChecked())
cellItem->setText("女");
}
// 判斷年齡,並寫回到第3列
if(col == 2)
cellItem->setText(ui->lineEdit_2->text());
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}