• 12812阅读
  • 11回复

[原创]请教一个关于Qtablewidget::update()的问题? [复制链接]

上一主题 下一主题
离线x3340574
 
只看楼主 倒序阅读 楼主  发表于: 2012-10-31
新手请教 为什么Qtablewidget::update 命令 仅仅更新表格中第一个的数据(即0,0),而不是整个表单。。。?
离线x3340574
只看该作者 1楼 发表于: 2012-10-31
没人回吗 自己顶一下
离线jdwx

只看该作者 2楼 发表于: 2012-11-01
update()是重画控件的界面,不会更新里面的数据。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线cool609

只看该作者 3楼 发表于: 2012-11-01
回 楼主(x3340574) 的帖子
想更新数据可以直接用item(int nRow, int  nCol)得到QTableWidgetItem然后用setText更新。你的问题问的有点儿不明白
离线x3340574
只看该作者 4楼 发表于: 2012-11-01
程序代码
oilselectdialog::oilselectdialog(QWidget *parent):QDialog(parent){  setupUi(this);  setWindowTitle(tr("润滑油选择卡"));  connect(OkpushButton, SIGNAL(clicked()), this, SLOT(readoilselectfile()));//初始化oiddateQString  for(i=0;i<9;i++) {      oilselectQSring=" "; }  for(i=0;i<5;i++) {      QTableItem= new QTableWidgetItem(oilselectQSring);      oiltableWidget_1->setItem(i,0, QTableItem); }  for(i=5;i<9;i++) {      QTableItem= new QTableWidgetItem(oilselectQSring);      oiltableWidget_2->setItem(i-5,0, QTableItem); }}oilselectdialog::~oilselectdialog(){}void oilselectdialog::readoilselectfile(){    QFile file("oildata.txt");    if(file.open(QIODevice::ReadOnly))    {        QTextStream in(&file);        int i;        for(i=0;i<=oilselectcomboBox->currentIndex();i++)     {        in>>oilselectQSring[0]>>oilselectQSring[1]>>oilselectQSring[2]>>oilselectQSring[3]>>oilselectQSring[4]>>oilselectQSring[5]>>oilselectQSring[6]>>oilselectQSring[7]>>oilselectQSring[8];     }    }    for(i=0;i<9;i++)   {      QTableItem->setText(oilselectQSring);   }   oiltableWidget_1->update();   oiltableWidget_2->update();}
离线cool609

只看该作者 5楼 发表于: 2012-11-01
回 4楼(x3340574) 的帖子
QTableItem是什么?取的一个指针么?指向是哪里?
离线x3340574
只看该作者 6楼 发表于: 2012-11-01

按照我的思路 应该都更新的 怎么就只是更新每个tablewidget的第一个Item?
离线cool609

只看该作者 7楼 发表于: 2012-11-01
回 6楼(x3340574) 的帖子
首先,我解释一下,update是用来重画界面的。更新的是paintEvent的事件。

你的意思应该是,获取了一些数据然后把输入放入到QtableWidget里面吧。

这样的话,你可以先得到获取的数据的数量,然后根据这个用setRowCount和setColumnCount两个方法进行设置行列数量,然后用item(int nRow, int nCol)取出来每个QTableWidgetItem的指针,如果为空的话,new一个然后setItem设置进去,每一个item都有一个setText()时间,你可以通过循环将你数组中的值写进去。
离线x3340574
只看该作者 8楼 发表于: 2012-11-01
首先 谢谢你费心了
我的思路是 先用UI 定义一个tablewidget类  然后定义Qtableitem 放入tablewidget中, 利用settext(对应的QString)设置Qtableitem,最后用tablewidget->update() 更新显示。  但是结果只更新tablewidget的第一个元素
离线cool609

只看该作者 9楼 发表于: 2012-11-01
回 8楼(x3340574) 的帖子
我很少用ui去画,基本都用代码实现了。

你的意思我大概明白了,其实就是想让tablewidget的行列显示数据对吗?

如果是这样,我觉得你完全可以用一个for循环嵌套 搞定。第一个for循环为行,第二个为列,然后在循环中new每一个item然后settext,这样就可以了。
离线cool609

只看该作者 10楼 发表于: 2012-11-01
回 8楼(x3340574) 的帖子
如果我晚上有时间的话,可以帮你写一个例子。你可以参考下看看是不是那个意思。
离线cool609

只看该作者 11楼 发表于: 2012-11-01
你可以看下
  1. /// @file qtablewidgettest.h
  2. ///
  3. /// @brief
  4. /// QTableWidget测试的头文件
  5. ///
  6. /// @author Cool609
  7. /// @date 2012/11/01
  8. #ifndef QTABLEWIDGETTEST_H
  9. #define QTABLEWIDGETTEST_H
  10. #include <QtGui/QWidget>
  11. #include <QTableWidget>
  12. #include <QLabel>
  13. #include <QComboBox>
  14. #include <QPushButton>
  15. //#include "ui_qtablewidgettest.h"
  16. class QTableWidgetTest : public QWidget
  17. {
  18.     Q_OBJECT
  19. public:
  20.     QTableWidgetTest(QWidget *parent = 0, Qt::WFlags flags = 0);
  21.     ~QTableWidgetTest();
  22.     //  @{
  23.     bool SetRowText(QTableWidget* pTableWidget, int nRow, QStringList strLst);
  24.     //  @}
  25. protected:
  26.     //  @{
  27.     QLabel*                m_pLabelTitle;
  28.     QTableWidget*        m_pTableWidgetOne;
  29.     QTableWidget*        m_pTableWidgetTwo;
  30.     QComboBox*            m_pComboNum;
  31.     QPushButton*        m_pBtnOk;
  32.     QPushButton*        m_pBtnCancel;
  33.     //  @}
  34. private:
  35.     //Ui::QTableWidgetTestClass ui;
  36. };
  37. #endif // QTABLEWIDGETTEST_H


实现文件:
  1. #include "qtablewidgettest.h"
  2. #include <QVBoxLayout>
  3. #include <QHBoxLayout>
  4. QTableWidgetTest::QTableWidgetTest(QWidget *parent, Qt::WFlags flags)
  5.     : QWidget(parent, flags)
  6.     , m_pLabelTitle(NULL)
  7.     , m_pTableWidgetOne(NULL)
  8.     , m_pTableWidgetTwo(NULL)
  9.     , m_pComboNum(NULL)
  10.     , m_pBtnOk(NULL)
  11.     , m_pBtnCancel(NULL)
  12. {
  13.     //ui.setupUi(this);
  14.     QVBoxLayout* pLayoutMain = new QVBoxLayout;
  15.     {
  16.         QStringList strLstTitle;
  17.         strLstTitle << tr("Name") << tr("Viscosity(38)") << tr("Viscosity(82)") << tr("Viscosity(100)") << tr("density");
  18.         m_pLabelTitle = new QLabel(tr("lubricating oil param"), this);
  19.         m_pLabelTitle->setAlignment(Qt::AlignCenter);
  20.         m_pTableWidgetOne = new QTableWidget(this);
  21.         m_pTableWidgetOne->setColumnCount(strLstTitle.size());
  22.         m_pTableWidgetOne->setHorizontalHeaderLabels(strLstTitle);
  23.         strLstTitle.clear();
  24.         strLstTitle << tr("1") << tr("2") << tr("3") << tr("4");
  25.         m_pTableWidgetTwo = new QTableWidget(this);
  26.         m_pTableWidgetTwo->setColumnCount(strLstTitle.size());
  27.         m_pTableWidgetTwo->setHorizontalHeaderLabels(strLstTitle);
  28.         
  29.         m_pComboNum = new QComboBox(this);
  30.         QHBoxLayout* pLayoutCtrl = new QHBoxLayout;
  31.         {
  32.             m_pBtnOk = new QPushButton(tr("Ok"), this);
  33.             m_pBtnCancel = new QPushButton(tr("Cancel"), this);
  34.             pLayoutCtrl->addWidget(m_pBtnOk);
  35.             pLayoutCtrl->addWidget(m_pBtnCancel);
  36.             pLayoutCtrl->setAlignment(Qt::AlignRight);
  37.         }
  38.         pLayoutMain->addWidget(m_pLabelTitle);
  39.         pLayoutMain->addWidget(m_pTableWidgetOne);
  40.         pLayoutMain->addWidget(m_pTableWidgetTwo);
  41.         pLayoutMain->addWidget(m_pComboNum);
  42.         pLayoutMain->addLayout(pLayoutCtrl);
  43.         setLayout(pLayoutMain);
  44.     }
  45.     setWindowTitle(tr("Title"));
  46.     QStringList strLstContent;
  47.     strLstContent << tr("1") << tr("2") << tr("3") << tr("4") << tr("5");
  48.     SetRowText(m_pTableWidgetOne, -1, strLstContent);
  49.     SetRowText(m_pTableWidgetTwo, -1, strLstContent);
  50. }
  51. QTableWidgetTest::~QTableWidgetTest()
  52. {
  53. }
  54. bool QTableWidgetTest::SetRowText(QTableWidget* pTableWidget, int nRow, QStringList strLst)
  55. {
  56.     bool bSuccess = false;
  57.     do
  58.     {
  59.         int nConfigRow = nRow;
  60.         if (!pTableWidget || strLst.size() < pTableWidget->columnCount())
  61.         {
  62.             break;
  63.         }
  64.         if (nRow = -1)
  65.         {
  66.             pTableWidget->insertRow(pTableWidget->rowCount());
  67.             nConfigRow = pTableWidget->rowCount() - 1;
  68.         }
  69.         for (int nCol = 0; nCol < pTableWidget->columnCount(); nCol++)
  70.         {
  71.             QTableWidgetItem* pItem = NULL;
  72.             if (pItem = pTableWidget->item(nConfigRow, nCol))
  73.             {
  74.                 pItem->setText(strLst.at(nCol));
  75.             }
  76.             else
  77.             {
  78.                 pItem = new QTableWidgetItem;
  79.                 pItem->setText(strLst.at(nCol));
  80.                 pTableWidget->setItem(nConfigRow, nCol, pItem);
  81.             }
  82.         }
  83.         bSuccess = true;
  84.     } while (false);
  85.     return bSuccess;
  86. }

你可以用SetRowText进行设置


实现图片:

描述:主文件
附件: main.cpp (1 K) 下载次数:5
描述:实现文件
附件: qtablewidgettest.cpp (3 K) 下载次数:5
描述:头文件
附件: qtablewidgettest.h (1 K) 下载次数:5
快速回复
限100 字节
 
上一个 下一个