读书人

QTableWidget,该怎么处理

发布时间: 2013-12-13 00:50:19 作者: rapoo

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

读书人网 >QT开发

热点推荐