Вывод списка процессов Windows 10 в компонент Qt

243
03 июля 2022, 02:10

При написании курсового проекта столкнулся с проблемой: при нажатии на компонент MenuBar у меня не происходит вывод значений на компонент TableWidget и я не могу понять в чём проблема. Есть предположение, что я где-то напортачил с сигналами и слотами, но когда я пытался их фиксить, то всё равно ничего не менялось. Работаю на Windows 10, программа пишется под эту же ОС (аналог Диспетчера задач) с помощью WinAPI (заголовочный файл Windows.h). Проект на Qt интегрирован в Visual Studio 2019. Процедуру обновления формы прилагаю.

PTManager::PTManager(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    connect(this, SIGNAL(triggered()), this, SLOT(close_PTManager_menu_triggered()));
    connect(this, SIGNAL(triggered()), this, SLOT(update_menu_triggered()));
}
void PTManager::update_menu_triggered() {
        SmartHandle processSnap(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
        SmartHandle threadsSnap(CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0));
        std::vector<THREADENTRY32> threads;
        THREADENTRY32 te{ sizeof(THREADENTRY32) };
        if (Thread32First(threadsSnap, &te) == FALSE)
        {
            QMessageBox::warning(this, "Предупреждение", "Thread32First вернуло значение FALSE.");
        }
        do
        {
            threads.push_back(te);
        } while (Thread32Next(threadsSnap, &te));
        std::vector<ProcessInfo> procInfos;
        PROCESSENTRY32 pe{ sizeof(PROCESSENTRY32) };
        if (Process32First(processSnap, &pe) == FALSE)
        {
            QMessageBox::warning(this, "Предупреждение", "Process32First вернуло значение FALSE.");
        }
        do
        {
            std::vector<THREADENTRY32> subThreads;
            for (const auto& thread : threads)
            {
                if (thread.th32OwnerProcessID == pe.th32ProcessID)
                {
                    subThreads.push_back(thread);
                }
            }
            procInfos.push_back(ProcessInfo{ pe });
        } while (Process32Next(processSnap, &pe));
        for (const auto& ProcessInfo : procInfos)
        {
            for (int i = 0; i < sizeof(procInfos); i++)
            {
                QString str = QString::fromWCharArray(pe.szExeFile, -1);
                QTableWidgetItem* newItem = new (QTableWidgetItem);
                newItem->setText(str);
                ui.proc_tableWidget->setItem(i + 1, 1, newItem);
            }
        }
}

Так же приложу классы SmartHandle...

class SmartHandle 
{
public:
    SmartHandle(HANDLE handle) 
    {
        _handle = handle;
    }
    ~SmartHandle() 
    {
        if (_handle) 
        {
            CloseHandle(_handle);
        }
    }
    operator bool()
    {
        return _handle != NULL;
    }
    operator HANDLE()
    {
        return _handle;
    }
    HANDLE handle()
    {
        return _handle;
    }
private:
    HANDLE _handle = NULL;
};

...и PTManager.

class PTManager : public QMainWindow
{
    Q_OBJECT
public:
    PTManager(QWidget *parent = Q_NULLPTR);
signals:
private slots:
    void close_PTManager_menu_triggered();
    void update_menu_triggered();
private:
    Ui::PTManagerClass ui;
};
Answer 1

Вы пытаетесь соединить со слотом несуществующий сигнал. Обратите внимание на вывод отладчика. он вам явно говорит что-то типа

QObject::connect: No such signal MainWindow::triggered()

Для MOC такая запись не является проблемой. Ну нет и нет сигнала. Просто скажет что нет такого...

в connect передается: 1. Кто отправитель сигнала, 2. Какой сигнал, 3. Объект-получатель, 4. слот или сигнал объекта-получателя

У вас должно быть что-то типа:

connect(ui->update_menu, SIGNAL(triggered()), this, SLOT(update_menu_triggered()));

т.к. отправитель сигнала update_menu а не mainwindow

READ ALSO
QListWidget проверка на выделение

QListWidget проверка на выделение

Как правильно организовать проверку на выделение какого-либо элемента QListWidgetВ пример прилагаю мой QListWidget с таймерами - элементами списка

415
Как записать вектор в бинарный файл?

Как записать вектор в бинарный файл?

В чём разница между следующими записями? Как правильно записать вектор в бинарный файл?

308