如何实现编辑QTableWidget';从GUI中直接输入垂直和水平标题文本,而不是以编程方式?
我有一个QTableWidget,它显示在用户界面中,我可以使用按钮添加和删除行和列。问题是,当我添加行或列时,我可以更改实际单元格中的数据,但我无法命名行或列。名称只是一个静态数字 是否有一种方法允许我的程序的用户双击行/列标题并在线编辑名称或类似的内容如何实现编辑QTableWidget';从GUI中直接输入垂直和水平标题文本,而不是以编程方式?,qt,qt5,qtablewidget,Qt,Qt5,Qtablewidget,我有一个QTableWidget,它显示在用户界面中,我可以使用按钮添加和删除行和列。问题是,当我添加行或列时,我可以更改实际单元格中的数据,但我无法命名行或列。名称只是一个静态数字 是否有一种方法允许我的程序的用户双击行/列标题并在线编辑名称或类似的内容 谢谢。据我所知,没有内置的方法可以做到这一点。但是,这可以手动实现。下面代码的主要思想是检测对标题项的双击,将QLineEdit放置在标题项上,并在失去焦点时保存编辑的文本。该示例基于Qt生成的设计器表单类,该类具有名为ui->tableWi
谢谢。据我所知,没有内置的方法可以做到这一点。但是,这可以手动实现。下面代码的主要思想是检测对标题项的双击,将QLineEdit放置在标题项上,并在失去焦点时保存编辑的文本。该示例基于Qt生成的设计器表单类,该类具有名为
ui->tableWidget
的表,该表可以是QTableWidget
或QTableView
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QLineEdit* header_editor;
int editor_index;
bool eventFilter(QObject*, QEvent*);
};
资料来源:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
header_editor = 0;
ui->setupUi(this);
ui->tableWidget->horizontalHeader()->viewport()->installEventFilter(this);
ui->tableWidget->verticalHeader()->viewport()->installEventFilter(this);
}
MainWindow::~MainWindow() {
delete ui;
}
bool MainWindow::eventFilter(QObject* object, QEvent* event) {
if ((object == ui->tableWidget->horizontalHeader()->viewport() ||
object == ui->tableWidget->verticalHeader()->viewport()) &&
event->type() == QEvent::MouseButtonDblClick) {
if (header_editor) { //delete previous editor just in case
header_editor->deleteLater();
header_editor = 0;
}
QMouseEvent* e = static_cast<QMouseEvent*>(event);
QHeaderView* header = static_cast<QHeaderView*>(object->parent());
int mouse_pos = header->orientation() == Qt::Horizontal ? e->x() : e->y();
int logical_index = header->logicalIndex(header->visualIndexAt(mouse_pos));
if (logical_index >= 0) { // if mouse is over an item
QRect rect; // line edit rect in header's viewport's coordinates
if (header->orientation() == Qt::Horizontal) {
rect.setLeft(header->sectionPosition(logical_index));
rect.setWidth(header->sectionSize(logical_index));
rect.setTop(0);
rect.setHeight(header->height());
} else {
rect.setTop(header->sectionPosition(logical_index));
rect.setHeight(header->sectionSize(logical_index));
rect.setLeft(0);
rect.setWidth(header->width());
}
rect.adjust(1, 1, -1, -1);
header_editor = new QLineEdit(header->viewport());
header_editor->move(rect.topLeft());
header_editor->resize(rect.size());
header_editor->setFrame(false);
//get current item text
QString text = header->model()->
headerData(logical_index, header->orientation()).toString();
header_editor->setText(text);
header_editor->setFocus();
editor_index = logical_index; //save for future use
header_editor->installEventFilter(this); //catch focus out event
//if user presses Enter it should close editor
connect(header_editor, SIGNAL(returnPressed()),
ui->tableWidget, SLOT(setFocus()));
header_editor->show();
}
return true; // filter out event
} else if (object == header_editor && event->type() == QEvent::FocusOut) {
QHeaderView* header = static_cast<QHeaderView*>(
header_editor->parentWidget()->parentWidget());
//save item text
header->model()->setHeaderData(editor_index, header->orientation(),
header_editor->text());
header_editor->deleteLater(); //safely delete editor
header_editor = 0;
}
return false;
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
标题编辑器=0;
用户界面->设置用户界面(此);
ui->tableWidget->horizontalHeader()->viewport()->installEventFilter(此);
ui->tableWidget->verticalHeader()->viewport()->installEventFilter(此);
}
MainWindow::~MainWindow(){
删除用户界面;
}
bool主窗口::事件过滤器(QObject*对象,QEvent*事件){
如果((对象==ui->tableWidget->horizontalHeader()->viewport())||
对象==ui->tableWidget->verticalHeader()->viewport())&&
事件->类型()==QEvent::MouseButtonDblClick){
if(header_editor){//删除以前的编辑器以防万一
标题编辑器->删除后期();
标题编辑器=0;
}
QMouseEvent*e=静态广播(事件);
QHeaderView*header=静态_强制转换(对象->父对象());
int mouse_pos=header->orientation()==Qt::Horizontal?e->x():e->y();
int logical_index=header->logicalIndex(header->visualindex(鼠标位置));
如果(逻辑索引>=0){//如果鼠标在项目上
QRect rect;//在标题的视口坐标中行编辑rect
如果(标题->方向()==Qt::水平){
rect.setLeft(标题->区段位置(逻辑索引));
rect.setWidth(标题->节大小(逻辑索引));
矩形setTop(0);
rect.setHeight(标题->高度());
}否则{
rect.setTop(标题->区段位置(逻辑索引));
rect.setHeight(标题->节大小(逻辑索引));
矩形设置左(0);
设置宽度(标题->宽度());
}
直接调整(1,1,-1,-1);
header_editor=newQlineedit(header->viewport());
标题编辑器->移动(rect.topLeft());
标题编辑器->调整大小(rect.size());
标题编辑器->设置框架(错误);
//获取当前项目文本
QString text=标题->模型()->
headerData(逻辑索引,header->orientation()).toString();
标题编辑器->设置文本(文本);
标题编辑器->设置焦点();
编辑器索引=逻辑索引;//保存以备将来使用
header_editor->installEventFilter(this);//捕获焦点输出事件
//若用户按Enter键,则应关闭编辑器
连接(标题编辑器,信号(returnPressed()),
ui->tableWidget,插槽(setFocus());
标题编辑器->显示();
}
返回true;//筛选出事件
}else if(object==header\u editor&&event->type()==QEvent::FocusOut){
QHeaderView*页眉=静态(
标题编辑器->parentWidget()->parentWidget());
//保存项目文本
标题->模型()->setHeaderData(编辑器索引,标题->方向(),
标题编辑器->文本();
header_editor->deleteLater();//安全删除编辑器
标题编辑器=0;
}
返回false;
}
这种方法的缺点是它很粗糙,当标题被调整大小或表格被滚动时,情况就会变糟。这只是一个可以改进的例子
我觉得必须有一个更简单的方法。但是Qt头忽略了
Qt::ItemIsEditable
标志,不能使用委托 您是否研究过设置QHeaderView::editTriggers()?