首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

QTableWidget,该怎么处理

2013-12-13 
QTableWidget大家好我现在有一个tableWidget, 它显示一些数据并计算这些数据的最大值,最小值以及平均值。

QTableWidget
大家好

我现在有一个tableWidget, 它显示一些数据并计算这些数据的最大值,最小值以及平均值。 我还添加了一个reset按钮,如果点击它这个列表当中的所有数据都应当被重置。但是响应事件不起作用。。。已经试了两天了还是没有什么眉目,跪求大神帮助。 以下是代码:

#include "tablewindow.h"
#include "preferences.h"
#include "averager.h"
#include "naturalStringCompare.h"
#include <QDateTime>
#include <QDebug>
#include <QPen>

TableWindow::TableWindow(Preferences &prefs, QWidget *parent) :
    QDialog(parent)
{
    wantScBeforeOthers = prefs.scBeforeOthers();
    labelFont          = prefs.labelFont();
    QFontMetrics fm(labelFont);
    labelFontWidth     = fm.width(" 00:00:00 ");
    mainLayout = new QVBoxLayout;

    index = 0;
    avg = 0.0;
    min = 100;
    max = 0;
    isResetted = false;

    // Set up the colors (Ericsson Brand colors as of 2013)
    brandColors = new QList<QColor>;
    brandColors->append(QColor(0xFF00285F));
    brandColors->append(QColor(0xFF7B0663));
    brandColors->append(QColor(0xFFE32119));
    brandColors->append(QColor(0xFFF08A00));
    brandColors->append(QColor(0xFFFABB00));
    brandColors->append(QColor(0xFF89BA17));
    brandColors->append(QColor(0xFF00625F));
    brandColors->append(QColor(0xFF00A9D4));
    brandColors->append(QColor(0xFF000000));
    brandColors->append(QColor(0xFF333333));
    brandColors->append(QColor(0xFFB1B3B4));
    brandColors->append(QColor(0xFF0066B3));

    tableWidget = new QTableWidget();
    tableWidget->setColumnCount(5);
    QStringList labels;
    labels.push_back("Name");
    labels.push_back("Value");
    labels.push_back("Avg.");
    labels.push_back("Min.");
    labels.push_back("Max.");

    tableWidget->setHorizontalHeaderLabels(labels);

    pal = new QPalette(palette());
    pal->setColor(QPalette::Window, Qt::white);
    setPalette(*pal);
    setAutoFillBackground(true);

    QSize sz = tableWidget->size();
    resize(sz.width() + 20, sz.height() + 20);
    qDebug() << "###Resizing to " << sz;

    mainLayout->addWidget(tableWidget);

    buttonLayout = new QHBoxLayout;
    reset_PB = new QPushButton("Reset");
    space = new QLabel();
    resetTime = new QLabel("Last reset at ...");
    buttonLayout->addWidget(reset_PB);
    buttonLayout->addWidget(space);
    buttonLayout->addWidget(resetTime);

    mainLayout->addLayout(buttonLayout);

    if (prefs.showHost())
    {
        this->setWindowTitle("Loadmeter  -- " + prefs.port());
    }
    else 
    {
        this->setWindowTitle("Loadmeter");
    }
    this->setLayout(mainLayout);

    connect(reset_PB,   SIGNAL(clicked()), this, SLOT(resetData(SimpleDataNode dataset)));
}

void TableWindow::setupData(QStringList names)
{
    QSet<QString> old_names_set = QSet<QString>::fromList(line_info.keys());
    QSet<QString> new_names_set = QSet<QString>::fromList(names);
    qDebug() << "Old names set: " << old_names_set;
    qDebug() << "New names set: " << new_names_set;

    if (new_names_set.unite(old_names_set).size() > old_names_set.size())
    {
        line_info.clear(); 
      
        QStringList new_names = QStringList::fromSet(new_names_set.unite(old_names_set));
        num_lines = new_names.length();

        if (wantScBeforeOthers)


        {
            QStringList sc = new_names.filter(QRegExp("^SC"));
            qSort(sc.begin(), sc.end(), NaturalStringCompareLessThan);
            QStringList others = new_names.filter(QRegExp("^[^S][^C]"));
            qSort(others.begin(), others.end(), NaturalStringCompareLessThan);
            new_names = sc + others;
        }
        else 
        {
            qSort(new_names.begin(), new_names.end(), NaturalStringCompareLessThan);
        }

        tableWidget->setRowCount(num_lines);

        for (int i = 0; i < num_lines; i++)
        {
            TableInfo *new_line_info = new TableInfo;
            new_line_info->line_no = i;
            new_line_info->history = new QList<int>;
     
            line_info[new_names[i]] = new_line_info;

            QTableWidgetItem *newItem1 = new QTableWidgetItem(new_names[i]);
            tableWidget->setItem(i, 0, newItem1);
            QTableWidgetItem *newItem2 = new QTableWidgetItem("");
            tableWidget->setItem(i, 1, newItem2);
            QTableWidgetItem *newItem3 = new QTableWidgetItem("");
            tableWidget->setItem(i, 2, newItem3);
            QTableWidgetItem *newItem4 = new QTableWidgetItem("");
            tableWidget->setItem(i, 3, newItem4);
            QTableWidgetItem *newItem5 = new QTableWidgetItem("");
            tableWidget->setItem(i, 4, newItem5);
        }

        QSize sz = tableWidget->size();
        resize(sz.width() + 20, sz.height() + 2);
        qDebug() << "###Resizing to " << sz;
    }
}


void TableWindow::showData(SimpleDataNode dataset)
{
    setupData(dataset.keys());

    QMapIterator<QString, TableInfo*> i(line_info);

    while (i.hasNext())
    {
        i.next();
        int val;

        bool data_available = dataset.contains(i.key());
        if (data_available)
        {
            val = dataset.value(i.key());
            int line_no = i.value()->line_no;
            qDebug() << "Graph: " + QString::number(line_no) + ", Value: " + QString::number(val);
            tableWidget->item(line_no, 1)->setText(QString::number(val));

            avg = (avg * index + val) / ++index;
            qDebug() << "Graph: " + QString::number(line_no) + ", Average: " + QString::number(avg);
            tableWidget->item(line_no, 2)->setText(QString::number(avg));

            min = min < val ? min : val;
            qDebug() << "Graph: " + QString::number(line_no) + ", Minimum: " + QString::number(min);


            tableWidget->item(line_no, 3)->setText(QString::number(min));

            max = max > val ? max : val;
            qDebug() << "Graph: " + QString::number(line_no) + ", Maximum: " + QString::number(max);
            tableWidget->item(line_no, 4)->setText(QString::number(max));
        }
    }
}

void TableWindow::showEvent(QShowEvent *event)
{
    QWidget::showEvent(event);
}

void TableWindow::resizeEvent(QResizeEvent *event)
{
    QWidget::resizeEvent(event);
}


void TableWindow::resetData(SimpleDataNode dataset)
{
    tableWidget->clearContents();
    index = 0;
    avg = 0.0;
    min = 100;
    max = 0;
    showData(dataset);
}

多谢大哥们的帮助!


[解决办法]
 connect(reset_PB,   SIGNAL(clicked()), this, SLOT(resetData(SimpleDataNode dataset)));
这个是你的信号槽连接的地方。信号没什么问题。这个槽我没看懂。槽的定义怎么看都跟信号对应不上啊。你这里的信号是无参的,那么槽也不会有参数。我是这么认为的。当然我不是很懂,只是没有像LZ这样用过。
[解决办法]
顺便说一句,如果想要让你的槽可以接受SimpleDataNode的参数,我认为(只不过是我会这么做,具体为啥我不知道,)你应该自定义一个信号,比如说是clickReset(SimpleDataNode),不过发射信号的时机还是在响应Click信号的时候。真是多此一举啊。总而言之,把槽的参数去掉。
[解决办法]
这个确实是信号槽的使用有问题,信号的参数必须跟槽函数的参数一致(个数,类型都得一致)

既然是reset,也没必要加个参数,直接在函数里设置不就完了。

你可以留意output输出,肯定会有错误提示的类似**** not match

热点排行