要更新QThread中的QtableWidget吗 我启动了一个名为Geess Stand的监视器项目,目的是监视Linux上的进程,我用C++和Qt与QtCuror。< /P>

要更新QThread中的QtableWidget吗 我启动了一个名为Geess Stand的监视器项目,目的是监视Linux上的进程,我用C++和Qt与QtCuror。< /P>,c++,linux,qt,C++,Linux,Qt,我已经开始创建一个QThread,其中包含一个函数,该函数被调用以重复填充QTableWidget,但即使在再次填充之前删除每一行,表也不会正确更新 我对Qt很陌生,从互联网上的不同来源获得了灵感 以下是QThread的代码: #include <unistd.h> #include <ios> #include <iostream> #include <fstream> #include <string> #include <d

我已经开始创建一个QThread,其中包含一个函数,该函数被调用以重复填充QTableWidget,但即使在再次填充之前删除每一行,表也不会正确更新

我对Qt很陌生,从互联网上的不同来源获得了灵感

以下是QThread的代码:

#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
#include <stdio.h>
#include <cctype>
#include <stdlib.h>
#include <vector>
#include <sstream>
#include "renderprocesstablethread.h"
#include <proc/readproc.h>
#include <proc/procps.h>
#include "mainwindow.h"
using namespace std;


RenderProcessTableThread::RenderProcessTableThread(QObject *parent)
    : QThread(parent)
{
    restart = false;
    abort = false;
}

RenderProcessTableThread::~RenderProcessTableThread()
{
    mutex.lock();
    abort = true;
    condition.wakeOne();
    mutex.unlock();

    wait();
}

bool RenderProcessTableThread::isNum(char *s) {
    int i = 0,  flag;

    while(s[i]){
            //if there is a letter in a string then string is not a number
        if(isalpha(s[i]) || s[i] == '.'){
            flag = 0;
            break;
        }
        else flag = 1;
        i++;
        }
    if (flag == 1) return true;
    else return false;
}

string RenderProcessTableThread::convertDouble(double value) {
  std::ostringstream o;
  if (!(o << value))
    return "";
  return o.str();
}

string RenderProcessTableThread::convertInt(int value) {
  std::ostringstream o;
  if (!(o << value))
    return "";
  return o.str();
}



void RenderProcessTableThread::run()
{
    forever {
        mutex.lock();
        mutex.unlock();
        fillProcessTable();
        sleep(1000);
        //cout << "ça marche" << endl;
    }
    mutex.lock();
    if (!restart)
        condition.wait(&mutex);
    restart = false;
    mutex.unlock();

}


void RenderProcessTableThread::setLocalMainWindow(MainWindow& w)
{
    localMainWindow = &w;
    ui_tableWidgetProcessus = localMainWindow->findChild<QTableWidget*>("tableWidgetProcessus");
    ui_tableWidgetProcessus->setColumnCount(11);
    ui_tableWidgetProcessus->setColumnWidth(10,508);
    QFont fnt;
    fnt.setPointSize(10);
    fnt.setFamily("Arial");
    ui_tableWidgetProcessus->setFont(fnt);
    QStringList labels;
    labels << "user" << "pid" << "cpu" << "nice" << "vsz" << "rss" << "tty" << "stat" << "start" << "time" << "cmd";
    ui_tableWidgetProcessus->setHorizontalHeaderLabels(labels);
}


void RenderProcessTableThread::fillProcessTable() {

    QMutexLocker locker(&mutex);

    if (!isRunning()) {
        start(LowPriority);
    } else {
        restart = true;
        condition.wakeOne();
    }

    PROCTAB* proc = openproc(PROC_FILLUSR | PROC_FILLMEM | PROC_FILLSTAT | PROC_FILLSTATUS | PROC_FILLARG);
    proc_t proc_info;

    memset(&proc_info, 0, sizeof(proc_info));

    int totalRow = ui_tableWidgetProcessus->rowCount();
    for ( int i = 0; i < totalRow ; ++i )
    {
           ui_tableWidgetProcessus->removeRow(i);
    }

    int i = 0;
    while (readproc(proc, &proc_info) != NULL) {
      cout << proc_info.fuser << proc_info.tid << proc_info.cmd << proc_info.resident << proc_info.utime << proc_info.stime << endl;
      ui_tableWidgetProcessus->setRowCount(i+1);
      ui_tableWidgetProcessus->setItem(i,0,new QTableWidgetItem(QString(proc_info.fuser),0));
      ui_tableWidgetProcessus->setItem(i,1,new QTableWidgetItem(QString((char*)convertInt(proc_info.tid).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,2,new QTableWidgetItem(QString((char*)convertInt(proc_info.pcpu).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,3,new QTableWidgetItem(QString((char*)convertInt(proc_info.nice).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,4,new QTableWidgetItem(QString((char*)convertInt(proc_info.vm_size).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,5,new QTableWidgetItem(QString((char*)convertInt(proc_info.rss).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,6,new QTableWidgetItem(QString((char*)convertInt(proc_info.tty).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,7,new QTableWidgetItem(QString(proc_info.state),0));
      ui_tableWidgetProcessus->setItem(i,8,new QTableWidgetItem(QString((char*)convertInt(proc_info.start_time).c_str()),0));
      ui_tableWidgetProcessus->setItem(i,9,new QTableWidgetItem(QString((char*)convertInt(proc_info.stime).c_str()),0));

      //cout << "proc_info.tid : " << proc_info.tid << endl;
      //cout << "proc_info.cmdline : " << proc_info.cmdline << endl;

      string text;
      if (proc_info.cmdline != 0) {
        vector<string> v(proc_info.cmdline, proc_info.cmdline + sizeof(proc_info.cmdline) / sizeof(string));
        text = v[0];
      }
      else {
        vector<string> v;
        v.push_back(proc_info.cmd);
        text = v[0];
      }
      //string text = char_to_string(proc_info.cmdline);

      ui_tableWidgetProcessus->setItem(i,10,new QTableWidgetItem(QString((char*)text.c_str()),0));
      i++;
    }

    closeproc(proc);

}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“renderprocesstablethread.h”
#包括
#包括
#包括“mainwindow.h”
使用名称空间std;
RenderProcessTableThread::RenderProcessTableThread(QObject*parent)
:QThread(父线程)
{
重新启动=错误;
中止=错误;
}
RenderProcessTableThread::~RenderProcessTableThread()
{
mutex.lock();
中止=真;
条件wakeOne();
mutex.unlock();
等待();
}
bool RenderProcessTableThread::isNum(char*s){
int i=0,标志;
而(s[i]){
//如果字符串中有字母,则字符串不是数字
if(isalpha(s[i])| | s[i]=='。){
flag=0;
打破
}
else标志=1;
i++;
}
if(flag==1)返回true;
否则返回false;
}
字符串RenderProcessTableThread::convertDouble(双值){
std::ostringstream o;
如果(!(o)设置字体(fnt);
QStringList标签;

标签这看起来像是Qt的。 在您的情况下,线程发出信号,窗口中的一个插槽将被调用

因此,在RenderProcessTableThread.h中定义一个信号

signals:
void newValues(const QString &data);
在你的主窗口

public slots:
void showNewValues(const QString &data);
将数据添加到此插槽中的表中。 然后,您必须连接它们(例如,在创建线程之后,在主窗口的构造函数中)

每当您想要显示新数据时,都会发出信号(例如,
fillProcessTable()
函数中的某个位置):


Qt为您完成线程之间的连接。

您发布的内容不清楚,您希望看到什么以及结果是什么,并且不可能尝试编译和测试。请扩展您的文本或发布整个源代码。很抱歉,您可以在找到完整的源代码。我现在已经解决了这个问题,并且我正在推进该项目。感谢您的帮助:-)谢谢米兰尼亚,我用信号和插槽做了一些事情,几乎和您所说的一样,效果很好,我还纠正了一些小问题。如果您希望看到更多信息,该项目现在位于sourceforge.net上。
connect(yourThread, SIGNAL(newValues(QString)), this, SLOT(showNewValues(QString)));
emit newValues(yourValues);