解决嵌入式中QTableWidget双击出现空白QTableWidgetItem输入

简介: > 嵌入式中QTableWidget一般只能看数据不能编辑,或者是选择> 所以双击出现空白QTableWidgetItem是不允许的
今天突然想起在上个公司解决的一个BUG

嵌入式中QTableWidget一般只能看数据不能编辑,或者是选择
所以双击出现空白QTableWidgetItem是不允许的

所说BUG现象

BUG1.gif

解决

在空白的单元格中,添加不可编辑的QTableWidgetItem

方式1不用遍历,在ItemMaxNum处开始添加
方式2遍历,在空白的单元格处开始添加

方式1

  • 主要内容
 //如果QTableWidgetItem个数不是3的倍数,最后一行没有满,布局会自动补充一个空白控件,多次点击才能出现
if(ItemMaxNum%Column!=0&&(i+1)==ItemMaxNum)
{
    // 设置空白项的文本为 ""
    for(int k = (ItemMaxNum%Column); k < table->columnCount(); k++) {
        QTableWidgetItem* item = new QTableWidgetItem("");
        item->setFlags(item->flags() ^ Qt::ItemIsEditable);
        table->setItem(table->rowCount() - 1, k, item);
    }
}

方式2

  • 主要内容
if(ItemMaxNum!=Row*Column)
{
    for (int row = 0; row < Row; row++) {
       for (int col = 0; col < Column; ++col) {
           auto item = table->cellWidget(row,col); //灵活变通:table->item(int row, int column)
           if(item==nullptr){
               QTableWidgetItem* items = new QTableWidgetItem("");
               items->setFlags(items->flags() ^ Qt::ItemIsEditable);
               table->setItem(row, col, items);
           }
       }
    }
}

全部内容


#include "testbug.h"
#define Column 3
#define Row 6
#define ItemMaxNum 16
TestBug::TestBug(QWidget *parent)
    : QWidget(parent)
{
    //窗口将始终显示在其他窗口之上
    this->setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint);
    this->setFixedSize(800,600);
    QTableWidget *table = new QTableWidget;
    table->horizontalHeader()->hide();
    table->verticalHeader()->hide();
    table->horizontalHeader()->setStretchLastSection(true);
    table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    table->setFocusPolicy(Qt::NoFocus); // 去除选中虚线
    table->setSelectionMode(QAbstractItemView::NoSelection);
    table->setStyleSheet("QTableWidget{gridline-color:white;background:DeepSkyBlue; border:0px solid #ffffff;border-bottom-width:0px;border-right-width:0px;}");
    table->setColumnCount(Column);
    table->setRowCount(Row);
    table->setShowGrid(false);
    QHBoxLayout *hboxLayout = new QHBoxLayout(this);
    hboxLayout->addWidget(table);

    int row =0,col=0;
    for (int i = 0; i < ItemMaxNum; i++) {
        col = i;
        if (col >= Column)
        {
            if (col % Column == 0)
            {
                row++;
            }
            col %= Column;
        }
        QString style = QString("QPushButton[status=\"1\"]{font-size:28px;background-color:transparent;color:rgb(255,255,255);border-radius:10;border:2px solid white;}"
                                "QPushButton[status=\"2\"]{background-color:rgb(255,255,255);font-size:28px;color:#06411B;border-radius:10;border:2px solid white;}");
        QWidget *pbtnWidget = new QWidget;
        QHBoxLayout *pbtnLayout = new QHBoxLayout;
        QPushButton *pBtn = new QPushButton(QString::fromLocal8Bit("[%1]号").arg(i), pbtnWidget);
        pbtnLayout->addWidget(pBtn);
        pbtnWidget->setLayout(pbtnLayout);
        pBtn->setFixedSize(QSize(185, 50));
        pBtn->setProperty("status", "2");
        pBtn->setStyleSheet(style);
        pBtn->setFocusPolicy(Qt::NoFocus);
        pBtn->setObjectName(QString::number(i));
        table->setCellWidget(row, col, pbtnWidget);
        //如果QTableWidgetItem个数不是3的倍数,最后一行没有满,布局会自动补充一个空白控件,多次点击才能出现
#if 0
        // 方式1
        if(ItemMaxNum%Column!=0&&(i+1)==ItemMaxNum)
        {
            // 设置空白项的文本为 ""
            for(int k = (ItemMaxNum%Column); k < table->columnCount(); k++) {
                QTableWidgetItem* item = new QTableWidgetItem("");
                item->setFlags(item->flags() ^ Qt::ItemIsEditable);
                table->setItem(table->rowCount() - 1, k, item);
            }
        }
#endif
         connect(pBtn, SIGNAL(clicked()), this, SLOT(onBtnClick()));
    }

    //方式2
    if(ItemMaxNum!=Row*Column)
    {
         for (int row = 0; row < Row; row++) {
            for (int col = 0; col < Column; ++col) {
                auto item = table->cellWidget(row,col); //灵活变通:table->item(int row, int column)
                if(item==nullptr){
                    QTableWidgetItem* items = new QTableWidgetItem("");
                    items->setFlags(items->flags() ^ Qt::ItemIsEditable);
                    table->setItem(row, col, items);
                }
            }
         }
    }
}

TestBug::~TestBug()
{
}

void TestBug::onBtnClick()
{
    QPushButton *pBtn = qobject_cast<QPushButton *>(QObject::sender());
    if (pBtn!=nullptr)
    {
         qDebug()<<pBtn->text()<<" ObjectName ="<<pBtn->objectName();
         if (1 == pBtn->property("status").toInt())
            pBtn->setProperty("status", "2");
         else
            pBtn->setProperty("status", "1");
         pBtn->setStyleSheet(pBtn->styleSheet());
    }
}

效果

  • QTableWidget双击出现空白QTableWidgetItem不再会出现输入

BUG2.gif

相关文章
|
Shell 开发者 Windows
windows 10中将任意程序添加进鼠标右键菜单里面
windows 10中将任意程序添加进鼠标右键菜单的详细步骤
228 0
windows 10中将任意程序添加进鼠标右键菜单里面
|
1月前
|
C语言 iOS开发 MacOS
MacOS环境-手写操作系统-28-输入文本框和鼠标移动窗体
MacOS环境-手写操作系统-28-输入文本框和鼠标移动窗体
32 0
|
6月前
LabVIEW数字控件的键盘对话框
LabVIEW数字控件的键盘对话框
49 0
|
IDE 程序员 编译器
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
C#编程学习09:vs2015的windows窗体应用程序创建及英文界面变换为中文界面的方法
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
Qt实用技巧:将QWidget作为输入窗口,接收键盘消息、输入法并且控制输入法悬浮工具栏位置控制
|
缓存 Windows
Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
471 0
Windows语言栏不见了,解决办法。任务栏的语言栏没了、不显示了。语言栏异常导致不能输入中文。默认中文输入法设置。
|
C#
艾伟_转载:C#下实现空白窗体上中文输入,可以实现类PS的文字工具
C#下实现空白窗体上中文输入 关键字:类PS的文字工具,中文输入.重复截取中文 最近在研究做一个类PS的文字工具,查了N多的资料,问了N多个人,总算功夫不负有人心.终于给弄出来了.写出来给大家一起讨论.
1157 0
|
C#
用C#开发类似QQ输入法的不规则窗体的程序详解+代码打包分享
QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的。。。等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能。
981 0
|
C#
C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板
原文:C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板 一、问题: 今天,我整理了一下两个问题 1、如何获取本机安装所有输入法,并设置为系统输出语言 2、如何打开搜狗拼音输入法工具栏和手写板: 二、解决方法 比如:我们要设置搜狗输入法为本机输...
2422 0
win10系统下如何用命令行的方式打开画图软件以及画图板汉字字体如何由竖排改为横排?
按 win + r 后输入命令 mspaint  再 回车 即可!如下图所示: 画图板正常默认的汉字排列是横排,但输入字体时选用不慎变为竖排,该怎样恢复为横排呢? 方法:字体名前不带@的,就是横排的,带@的就是竖排的。
1789 0
下一篇
无影云桌面