При написании курсового проекта столкнулся с проблемой: при нажатии на компонент 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;
};
Вы пытаетесь соединить со слотом несуществующий сигнал. Обратите внимание на вывод отладчика. он вам явно говорит что-то типа
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
Как правильно организовать проверку на выделение какого-либо элемента QListWidgetВ пример прилагаю мой QListWidget с таймерами - элементами списка
В чём разница между следующими записями? Как правильно записать вектор в бинарный файл?