用自定义信号(不仅仅是点击)触发QTableView的带有图标的单元格处于编辑状态

本文详细介绍如何在QTableView中通过绑定槽函数而非鼠标点击来切换单元格的编辑状态,包括打开和关闭编辑过程,以及如何处理单元格内的图标显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时可能不想通过鼠标点击QTableView的单元格使其处于编辑状态,而是想通过绑定槽函数的方式去实现。

下面进行说明:

openPersistentEditor(Index);打开编辑

closePersistentEditor(Index);关闭编辑

我的表格第一列的单元格需要编辑,并且单元格内有图标,编辑时图标消失,完成时图标显示。

打开编辑比较好处理,主要是关闭编辑,需要重写鼠标事件和键盘事件。

 

绑定打开编辑槽函数

connect(m_pRenameAction, &QAction::triggered, this, &MaterialTable::slotOpenPersistentEditor);
void MaterialTable::slotOpenPersistentEditor()
{
    if (currentR >= 0)
    {
        m_pLastItem = m_pStdTableModel->item(currentR, 0);
        m_lastIndex = m_pLastItem->index();
        m_icon = m_pLastItem->icon(); //保存原有图标
        m_pLastItem->setIcon(QIcon());//设置空图标

        openPersistentEditor(m_lastIndex);
        m_pEditCell = static_cast< QLineEdit* >(indexWidget(m_lastIndex));
        m_pEditCell->setStyleSheet("color:white");
        m_pEditCell->setFocus();
        //如果是文件名,默认选择文件名,不选择后缀
        if (TXT != m_currentType)
        {
            QString text = m_pLastItem->text();
            int index = text.lastIndexOf('.');
            index = index > 0 ? index : text.size();
            m_pEditCell->setSelection(0, index);
        }
    }
}

关闭编辑框函数

void MaterialTable::slotClosePersistentEditor()
{
    if (nullptr != m_pEditCell)
    {
        closePersistentEditor(m_lastIndex);
        m_pEditCell = nullptr;
    }
    if (!m_icon.isNull())
        m_pLastItem->setIcon(m_icon); //加载原有图标
}

主要是重写鼠标按下函数和键盘事件函数

MaterialTable 继承ResourceTable, RescourceTable 继承QTableView。

void MaterialTable::mousePressEvent(QMouseEvent *event)
{
    auto index = indexAt(event->pos());
    int tempRow = index.row();
    int tempCol = index.column();
    qDebug() << tempRow << "=" << currentR << "," << tempCol << "=" << currentC;
    if (tempRow < 0 || tempRow != currentR || tempCol != 0)
    {
        slotClosePersistentEditor();
    }
    if (event->button() == Qt::RightButton)
    {
        //这里代码主要是右键弹出菜单
        if (tempRow >=0 /*&& tempRow != currentR && tempCol != currentC*/)
        {
            m_currentType = m_pStdTableModel->data(index).toString().toStdString();
            if (TXT != m_currentType)
            {
                m_pMediaMenu->move(cursor().pos());
                m_pMediaMenu->show();
            }
            else
            {
                m_pTxtMenu->move(cursor().pos());
                m_pTxtMenu->show();
            }
        }
        currentR = tempRow;
        currentC = tempCol;
        if ( -1 == currentR || -1 == currentC)
        {
            emit signMouseRight();
        }
    }
   
    ResourceTable::mousePressEvent(event);
}
void MaterialTable::keyPressEvent(QKeyEvent *event)
{
   
    if (event->key() == Qt::Key_Enter || event->key() ==  Qt::Key_Escape || event->key() == Qt::Key_Return)
    {
        slotClosePersistentEditor();
    }
    ResourceTable::keyPressEvent(event);
}

注意!

关闭编辑框之前设置图标,回车后编辑的文本消失,还是原来的旧文本。

如果你在关闭编辑框之前(调用closePersistentEditor()之前)设置了原有图标(调用 m_pLastItem->setIcon(m_icon);),此时该Item的原有文本会覆盖掉你现在编辑框中的内容(看起来你的编辑框内容没有发生变化,其实如果你调用LineEdit::text()返回的就是你编辑之前的文本),这里要特别注意,setIcon()函数会用原来的文本覆盖掉编辑框内新编辑的文本(不仅仅是设置图标)。

在 Qt 框架中,控件(Widget)是构建图形用户界面(GUI)的基本元素。以下是一些常用的控件及其功能和使用场景: ### 常用控件介绍 #### 1. **QPushButton** QPushButton 是一个按钮控件,用于触发操作或事件。用户可以通过点击按钮来执行特定的功能。它支持文本、图标以及快捷键设置,是交互式界面中最基础的控件之一。 #### 2. **QLabel** QLabel 用于显示不可编辑的文本或图像。它可以设置为带有助记符的形式,通过 `setBuddy` 方法指定一个伙伴控件,当用户按下助记符时,焦点会转移到该控件上。[^3] #### 3. **QLineEdit** QLineEdit 是一个单行文本输入框控件,允许用户输入和编辑文本。它支持多种输入验证机制,例如限制输入为数字、日期等格式,常用于数据输入场景。 #### 4. **QTextEdit** QTextEdit 是一个多行文本编辑控件,支持富文本格式。它可以处理复杂的文本内容,包括字体、颜色、段落样式等,适用于需要展示或编辑大段文本的应用场景。 #### 5. **QComboBox** QComboBox 是一个下拉选择框控件,允许用户从预定义的选项中选择一个值。它既可以是只读的,也可以允许用户输入自定义值,常用于选项选择或数据过滤。 #### 6. **QCheckBox** QCheckBox 是一个复选框控件,用于表示两种状态(选中或未选中)。它可以与其他复选框组合使用,以支持多选功能,常用于配置选项或过滤条件。 #### 7. **QRadioButton** QRadioButton 是一个单选按钮控件,通常与其他单选按钮组合使用,形成一组互斥选项。用户只能在一组选项中选择一个,适用于需要单选的场景。 #### 8. **QSlider** QSlider 是一个滑动条控件,允许用户通过拖动滑块来选择一个数值范围内的值。它常用于调节音量、亮度等连续值的场景。 #### 9. **QSpinBox** QSpinBox 是一个数值输入控件,允许用户通过上下箭头或直接输入来选择一个数值。它支持设置最小值、最大值以及步长,适用于需要精确输入数值的场景。 #### 10. **QTableWidget** QTableWidget 是一个用于显示和操作表格数据的控件,继承自 QTableView,并与 QTableWidgetItem 一起使用。它提供了更高级的接口来管理表格中的单元格和行列,非常适合需要展示和操作二维数据集的场景。[^1] #### 11. **QListWidget** QListWidget 是一个列表控件,用于显示一组条目。用户可以选择一个或多个条目,适用于需要展示列表数据的场景。 #### 12. **QTabWidget** QTabWidget 是一个选项卡控件,允许用户在多个页面之间切换。每个页面可以包含不同的控件布局,适用于需要组织多个功能模块的场景。 #### 13. **QProgressBar** QProgressBar 是一个进度条控件,用于显示任务的完成进度。它支持确定性和不确定性两种模式,常用于长时间操作的反馈。 #### 14. **QCalendarWidget** QCalendarWidget 是一个日历控件,允许用户选择日期。它提供了一个可视化的日历界面,适用于需要选择日期的场景。 #### 15. **QDialog** QDialog 是一个对话框窗口容器,用于管理多个交互式控件。它可以是模态的或非模态的,适用于需要用户进行交互的操作,例如设置参数或确认操作。 #### 16. **QMainWindow** QMainWindow 是一个主窗口容器,通常由标题栏、菜单栏、工具条、状态栏以及中央显示区组成。它是构建复杂应用程序主界面的核心控件。[^4] #### 17. **QWidget** QWidget 是一个纯粹的窗口容器,是所有控件的基类。它可以作为其他控件的父容器,用于组织和管理控件的布局。[^4] #### 18. **QToolBar** QToolBar 是一个工具条控件,通常与 QMainWindow 一起使用,用于放置常用的工具按钮。它支持拖动和自定义布局,适用于需要快速访问功能的场景。 #### 19. **QStatusBar** QStatusBar 是一个状态栏控件,通常与 QMainWindow 一起使用,用于显示应用程序的状态信息。它支持显示文本、进度条等元素,适用于提供实时反馈的场景。 #### 20. **QMenuBar** QMenuBar 是一个菜单栏控件,通常与 QMainWindow 一起使用,用于组织和管理菜单项。它支持多级菜单结构,适用于需要复杂功能分类的场景。 ### 示例代码 以下是一个简单的 Qt 应用程序示例,展示了如何使用 QPushButton 和 QLabel: ```cpp #include <QApplication> #include <QLabel> #include <QPushButton> #include <QVBoxLayout> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setWindowTitle("Qt Controls Example"); // 设置窗口标题 [^2] QLabel label("Hello, Qt!"); QPushButton button("Click Me"); QObject::connect(&button, &QPushButton::clicked, [&label]() { label.setText("Button Clicked!"); }); QVBoxLayout layout(&window); layout.addWidget(&label); layout.addWidget(&button); window.show(); return app.exec(); } ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xhh-cy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值