2016-04-13 2 views
1

Выполняя некоторые обучающие темы по потокам, я увлекся и решил создать gui, который покажет мне влияние нескольких потоков, записывающих одну переменную, и использование мьютекса.Устранение неполадок connect() с сигналами и слотами

Приложение использует меню mainwindow.ui, чтобы каждый раз создавать новый экземпляр класса threaddialog, который затем запускает собственный поток, отображая его цикл цикла на ярлыках. Прежде чем перейти к выполнению цикла и переключению mutex, я пытаюсь подключить обновление count между mainwindow и threaddialog, поэтому mainwindow может отображать глобальное обновление счета.

Я не могу получить соединение() правильно, я пытаюсь передать ему указатель на новый threaddialog, который я только что сделал перед ним, поскольку это будет сигнализировать счет и сам сигнал. Затем для слота я использую этот указатель для отправки адреса 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 и слоты официальные документы, чтобы попытаться понять, что я делаю неправильно, но не повезло, и нуждаются в помощи. Я не верю, что я делаю что-то неправильно в отношении отправки этих указателей для подключения().

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); 
    } 
} 
+0

& newThread-> gCountUpdate – user3528438

ответ

0

Вот как это должно выглядеть следующим образом:

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

Вы должны получить указатель на метод, а не вызвать метод.

+0

Эта терминология была для меня новой, исследовала ее немного больше. Сначала я был смущен, потому что строка & ThreadDialog :: gCountUpdate просто указывает ссылку на тип/элемент на свой собственный, но не объект, который мне нужно знать. Я полагаю, что это то, что аргументы 1 и 3 есть, однако, в connect(). –