На QMainWindow находится пару QTableWidget'ов для того, чтобы раз в полсекунды выводить в них некоторый массив данных. QTableWidget используются только для отображения, редактировать их нельзя.
Для заполнения одной строчки таблицы использую следующую процедуру:
void MainWindow::fillTable(MEAS_PARAM AllData, bool evalFlag, QTableWidget *tw, int row)
{
QString out;
QTableWidgetItem *newValidity = new QTableWidgetItem();
QTableWidgetItem *newData = new QTableWidgetItem();
QTableWidgetItem *newData2 = new QTableWidgetItem();
QTableWidgetItem *newAverage = new QTableWidgetItem();
QTableWidgetItem *newSCE = new QTableWidgetItem();
QTableWidgetItem *newAMSD = new QTableWidgetItem();
QTableWidgetItem *newRCE = new QTableWidgetItem();
QTableWidgetItem *newMCE = new QTableWidgetItem();
// Выравнивание по правому краю
newValidity->setTextAlignment(Qt::AlignRight);
newData->setTextAlignment(Qt::AlignRight);
newData2->setTextAlignment(Qt::AlignRight);
newAverage->setTextAlignment(Qt::AlignRight);
newSCE->setTextAlignment(Qt::AlignRight);
newAMSD->setTextAlignment(Qt::AlignRight);
newRCE->setTextAlignment(Qt::AlignRight);
newMCE->setTextAlignment(Qt::AlignRight);
// Validity
txtBInput->append(" ");
newValidity->setText(QString::number(AllData.Meas.Validity, 10).toUpper());
tw->setItem(row, 0, newValidity);
txtBInput->insertPlainText(QString::number(AllData.Meas.Validity, 10).toUpper());
// Data.dotResult
txtBInput->insertPlainText("|");
out.setNum((AllData.Meas.Data.dotResult),'f', 4);
newData->setText(out);
newData->setToolTip(QString::number(AllData.Meas.Data.dotResult,'g', 4));
tw->setItem(row, 1, newData);
txtBInput->insertPlainText(out);
// Data2
txtBInput->insertPlainText("|");
newData2->setText(QString::number(AllData.Meas.Data2, 10).toUpper());
tw->setItem(row, 2, newData2);
txtBInput->insertPlainText(QString::number(AllData.Meas.Data2, 10).toUpper());
if(AllData.Meas.Validity == 0)
{
// Average
out.setNum(AllData.Average,'f', 4);
newAverage->setText(out);
newAverage->setToolTip(QString::number(AllData.Average,'g', 4).toUpper());
tw->setItem(row, 3, newAverage);
// MCE
out.setNum(AllData.MCE,'f', 4);
newMCE->setText(out);
newMCE->setToolTip(QString::number(AllData.MCE,'g', 4).toUpper());
tw->setItem(row, 4, newMCE);
// SCE
out.setNum(AllData.SCE,'f', 4);
newSCE->setText(out);
newSCE->setToolTip(QString::number(AllData.SCE,'g', 4).toUpper());
tw->setItem(row, 5, newSCE);
// RCE
out.setNum(AllData.RCE,'f', 4);
newRCE->setText(out);
newRCE->setToolTip(QString::number(AllData.RCE,'g', 4).toUpper());
tw->setItem(row, 6, newRCE);
// AMSD
out.setNum(AllData.AMSD,'f', 4);
newAMSD->setText(out);
newAMSD->setToolTip(QString::number(AllData.AMSD,'g', 4).toUpper());
tw->setItem(row, 7, newAMSD);
}
else
{
newAverage->setText("error");
newMCE->setText("error");
newSCE->setText("error");
newRCE->setText("error");
newAMSD->setText("error");
tw->setItem(row, 3, newAverage);
tw->setItem(row, 4, newMCE);
tw->setItem(row, 5, newSCE);
tw->setItem(row, 6, newRCE);
tw->setItem(row, 7, newAMSD);
}
// подкрашиваем ячейку
if(evalFlag == true)
{
newAverage->setTextColor(colorForIds[3]);
newSCE->setTextColor(colorForIds[3]);
newAMSD->setTextColor(colorForIds[3]);
newRCE->setTextColor(colorForIds[3]);
newMCE->setTextColor(colorForIds[3]);
}
else
{
newAverage->setTextColor(colorForIds[1]);
newSCE->setTextColor(colorForIds[1]);
newAMSD->setTextColor(colorForIds[1]);
newRCE->setTextColor(colorForIds[1]);
newMCE->setTextColor(colorForIds[1]);
}
}
используй Модель/представление. Эти вспомогательные виджеты предназначены для примитивных вещей
а когда окно не показано на экране, тормоза остаются ?
Если таблица неинтерактивная, нарисуй сетку сам, да сделай распечатку цветных циферок в ячейках. Будет летать
Ещё вариант - в момент заполнения той таблицы отключай автоперерисовку (если есть), а после заполнения включай обратно. Должна такая штука быть по любому
Нарисовал таблицу руками через paintEvent, после каждого появления данных для отображения вызываю this->update() и в paintEvent'e перерисовываю табличку. Все залетало.
Но возник следующий баг. При открытии QFileDialog:
const QString fileName = QFileDialog::getOpenFileName(
this,
tr("open File"),
QDir::currentPath(),
tr("Firmware Files (*.bin *.hex)") );
Виджет можно не писать? использовать QTtableView нужно написать класс модели, унаследованной от QAbstractTableModel.
Например так:
class ImageModel : public QAbstractTableModel
{
Q_OBJECT
public:
ImageModel(QObject *parent = 0);
void setImage(const QImage &image);
// Эти функции нужно переопределить
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
//------------------------------------------------------------
private:
QImage modelImage;
};
Соорудил модель-представление, все залетало как надо.
Всем спасибо.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)