标签: qtablewidget详解样式右键菜单表头塌陷表头事件 |
分类: Qt |
在Qt的开发过程中,时常会用到表单(QTableWidget)这个控件,网上的资料不少,但是都是最基本的,有一些比较经常遇到的问题也说得不太清楚。所以,今天就在这里总结一下!
以下为个人模拟Windows资源管理器的一个表单
一、设置表单样式
table_widget->setColumnCount(4); //设置列数
table_widget->horizontalHeader()->setDefaultSectionSize(150);
table_widget->horizontalHeader()->setClickable(false); //设置表头不可点击(默认点击后进行排序)
//设置表头内容 //设置表头字体加粗 QFont font = this->horizontalHeader()->font(); table_widget->setStyleSheet("selection-background-color:lightblue;"); //设置选中背景色 table_widget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); //设置表头背景色 //设置水平、垂直滚动条样式 table_widget->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}" table_widget->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}" 好了,样式设置完成,效果如下所示: 问题一:鼠标点击的选项会出现虚框,在Qt官网找到一篇博客专门介绍的,直接上代码! (1)实现如下一个类 #include "no_focus_delegate.h" void NoFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const QStyledItemDelegate::paint(painter, itemOption, index); (2)表格构造中添加如下代码 table_widget->setItemDelegate(new NoFocusDelegate()); OK,虚线边框去除 问题二:当表格只有一行的时候,则表头会出现塌陷问题 //点击表时不对表头行光亮(获取焦点) 二、多选并获取所选行 this->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置多选(可以Ctral+A全选Ctral+Shift多选)获取所选行号: bool TableWidget::getSelectedRow(QSet&set_row) { QList items = this->selectedItems(); int item_count = items.count(); if(item_count <= 0) { return false; } for(int i=0; i { //获取选中的行 int item_row = this->row(items.at(i)); set_row.insert(item_row); } return true; } 三、操作表单(添加、删除行等) (1)动态插入行 int row_count = table_widget->rowCount(); //获取表单行数 QTableWidgetItem *item = new QTableWidgetItem(); //设置对应的图标、文件名称、最后更新时间、对应的类型、文件大小 item3->setText(size); table_widget->setItem(row_count, 0, item); //设置样式为灰色 (2)在指定位置插入行 其实跟(1)相似,(1)的前提是获取到表格行数 table_widget->insertRow(row); //插入新行 row为插入的位置 四、单击表头触发的事件 (1)连接表头的信号和槽 connect(horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(onHeaderClicked(int))); (2)实现槽函数 void TableWidget::onHeaderClicked(int column) 五、打开某行进行编辑 既然模拟Window那么就模仿的像一点,Windows可以修改名称,那么Qt也必然可以实现 //获得当前节点并获取编辑名称 //关闭编辑项 table_widget->closePersistentEditor(item); OK,重命名完成,! 六、右键菜单 (1)创建菜单、菜单项 void TableWidget::createActions() action_open = new QAction(this); action_delete = new QAction(this); action_open->setText(QString("打开")); action_download->setText(QString("下载")); action_flush->setText(QString("刷新")); action_delete->setText(QString("删除")); action_rename->setText(QString("重命名")); action_create_folder->setText(QString("新建文件夹")); action_name->setText(QString("名称")); //设置快捷键 action_flush->setShortcut(QKeySequence::Refresh); //设置文件夹图标 QObject::connect(action_create_folder, SIGNAL(triggered()), this, SLOT(createFolder())); (2)重新实现contextMenuEvent void TableWidget::contextMenuEvent(QContextMenuEvent *event) QTableWidgetItem *item = this->itemAt(point); if(item != NULL) { pop_menu->addAction(action_download); sort_style = pop_menu->addMenu("排序"); //菜单出现的位置为当前鼠标的位置 } } OK,大功告成! void cellActivated(int row, int column) void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) 关于界面的文件(夹)图标和类型如何获取?对于文件而言,不同扩展名的文件至少也有100种以上,如果图标和类型固定写死的话必不可行,所以,这里提供以下两种方式获取。 更多关于QTableView的资料请参考: 以上都是在接触Qt以来总结的一些小经验,希望对大家有用!不积跬步无以至千里,不积小流无以成江河。。。
QStringList header;
header< table_widget->setHorizontalHeaderLabels(header);
font.setBold(true);
table_widget->horizontalHeader()->setFont(font);
table_widget->horizontalHeader()->setStretchLastSection(true); //设置充满表宽度
table_widget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
table_widget->verticalHeader()->setDefaultSectionSize(10); //设置行高
table_widget->setFrameShape(QFrame::NoFrame); //设置无边框
table_widget->setShowGrid(false); //设置不显示格子线
table_widget->verticalHeader()->setVisible(false); //设置垂直头不可见
table_widget->setSelectionMode(QAbstractItemView::ExtendedSelection); //可多选(Ctrl、Shift、 Ctrl+A都可以)
table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); //设置选择行为时每次选择一行
table_widget->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑
table_widget->horizontalHeader()->resizeSection(0,150); //设置表头第一列的宽度为150
table_widget->horizontalHeader()->setFixedHeight(25); //设置表头的高度
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}"
"QScrollBar::handle:hover{background:gray;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}");
{
QStyleOptionViewItem itemOption(option);
if (itemOption.state & QStyle::State_HasFocus)
{
itemOption.state = itemOption.state ^ QStyle::State_HasFocus;
}
}
摸索了很长时间,才得以解决:
table_widget->horizontalHeader()->setHighlightSections(false);
table_widget->insertRow(row_count); //插入新行
QTableWidgetItem *item1 = new QTableWidgetItem();
QTableWidgetItem *item2 = new QTableWidgetItem();
QTableWidgetItem *item3 = new QTableWidgetItem();
item->setIcon(icon); //icon为调用系统的图标,以后缀来区分
item->setText(name);
item1->setText(last_modify_time);
item2->setText(type); //type为调用系统的类型,以后缀来区分
table_widget->setItem(row_count, 1, item1);
table_widget->setItem(row_count, 2, item2);
table_widget->setItem(row_count, 3, item3);
QColor color("gray");
item1->setTextColor(color);
item2->setTextColor(color);
item3->setTextColor(color);
{
//column为所点击的表头的某列
}
QTableWidgetItem *item = table_widget->item(edit_row, 0); //edit_row为想要编辑的行号
table_widget->setCurrentCell(edit_row, 0);
table_widget->openPersistentEditor(item); //打开编辑项
table_widget->editItem(item);
{
//创建菜单项
pop_menu = new QMenu();
action_name = new QAction(this);
action_size = new QAction(this);
action_type = new QAction(this);
action_date = new QAction(this);
action_download = new QAction(this);
action_flush = new QAction(this);
action_rename = new QAction(this);
action_create_folder = new QAction(this);
action_size->setText(QString("大小"));
action_type->setText(QString("项目类型"));
action_date->setText(QString("修改日期"));
action_create_folder->setIcon(icon);
}
{
pop_menu->clear(); //清除原有菜单
QPoint point = event->pos(); //得到窗口坐标
pop_menu->addAction(action_flush);
pop_menu->addSeparator();
pop_menu->addAction(action_delete);
pop_menu->addAction(action_rename);
pop_menu->addSeparator();
pop_menu->addAction(action_create_folder);
sort_style->addAction(action_name);
sort_style->addAction(action_size);
sort_style->addAction(action_type);
sort_style->addAction(action_date);
pop_menu->exec(QCursor::pos());
event->accept();
七、信号
void cellChanged(int row, int column)
void cellClicked(int row, int column)
void cellDoubleClicked(int row, int column)
void cellEntered(int row, int column)
void cellPressed(int row, int column)
void itemActivated(QTableWidgetItem *item)
void itemChanged(QTableWidgetItem *item)
void itemClicked(QTableWidgetItem *item)
void itemDoubleClicked(QTableWidgetItem *item)
void itemEntered(QTableWidgetItem *item)
void itemPressed(QTableWidgetItem *item)
void itemSelectionChanged()