无法使用信号和插槽实现connect()

时间:2016-04-13 16:19:22

标签: c++ multithreading qt qthread

在做一些线程教程时,我被带走了,并决定制作一个gui,它将向我展示多线程写入一个变量并使用互斥锁的效果。

应用程序使用mainwindow.ui菜单每次创建一个新的threaddialog类实例,然后运行它自己的线程,在标签上显示它的计数循环。在我开始循环并进行互斥'切换'之前,我正在尝试连接主窗口和threaddialog之间的计数更新,因此mainwindow可以显示全局计数更新。

我无法正确获取connect(),我试图将它指向我之前刚刚创建的新threaddialog,因为这将指示计数和信号本身。然后对于插槽我使用this指针发送MainWindow的地址,就像插槽所在的那样,以及插槽名称本身。

就目前而言,connect()行给出了信号和插槽参数的这个错误。

C:\Users\btank\Documents\Qt Projects\QThreadClasses\mainwindow.cpp:46: error: C3867: 'ThreadDialog::gCountUpdate': non-standard syntax; use '&' to create a pointer to member

我已经阅读了有关Qt信号和插槽官方文档的整个页面,试图了解我做错了什么但没有运气并且需要帮助。关于将这些指针发送到connect(),我不相信我做错了。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGridLayout>
#include <threaddialog.h>
#include <QLinkedList>
#include <QDebug>

namespace Ui {

class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    QGridLayout *layout = new QGridLayout();
    void NewThread();
    ~MainWindow();

private slots:
    void on_actionNew_Thread_triggered();
    void on_actionDelete_Thread_triggered();

public slots:
    void setGCount(int gCount);

private:
    QLinkedList<ThreadDialog *> list;
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <threaddialog.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Clear memory list before using
    list.clear();

    qDebug() << list.count();

    // Set layout in widget
    QWidget *window = new QWidget();
    window->setLayout(layout);

    // Add widget to main window central widget
    setCentralWidget(window);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionNew_Thread_triggered()
{
    NewThread();
}

void MainWindow::NewThread()
{
    ThreadDialog *newThread = new ThreadDialog(list.count());
    qDebug() << list.count();
    connect(newThread, newThread->gCountUpdate, this, this->setGCount);
    newThread->run();

    list << newThread;
    layout->addWidget(newThread);
}


void MainWindow::on_actionDelete_Thread_triggered()
{
    layout->removeWidget(list.last());
    delete list.last();
    list.removeLast();
    qDebug() << list.count();
}

void MainWindow::setGCount(int gcount)
{
    ui->lblGCount->setText(QString::number(gcount));
}

threaddialog.h

#ifndef THREADDIALOG_H
#define THREADDIALOG_H

#include <QDialog>
#include <QThread>

namespace Ui {
class ThreadDialog;
}

class ThreadDialog : public QDialog
{
    Q_OBJECT

public:
    explicit ThreadDialog(int count, QWidget *parent = 0);
    void run();
    ~ThreadDialog();

signals:
    void gCountUpdate(int uCount);

private:
    Ui::ThreadDialog *ui;
};

#endif // THREADDIALOG_H

threaddialog.cpp

#include "threaddialog.h"
#include "ui_threaddialog.h"
#include "mainwindow.h"

ThreadDialog::ThreadDialog(int count, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ThreadDialog)
{
    ui->setupUi(this);

    // Setup UI
    ui->lblTCount->setText(QString("Thread %1").arg(count));
}

ThreadDialog::~ThreadDialog()
{
    delete ui;
}

void ThreadDialog::run()
{
    for(int i = 0; i < 100; i++)
    {
        qDebug() << (QString("Thread loop %1").arg(i));
        ui->lblTNum->setText(QString("Thread %1").arg(i));
        emit this->gCountUpdate(i);
        QThread::sleep(100);
    }
}

1 个答案:

答案 0 :(得分:0)

这应该是这样的:

connect(newThread, &ThreadDialog::gCountUpdate
        this, &MainWindow::setGCount);

您需要获取指向该方法的指针,而不是调用该方法。