Ошибка подключения сигнала Qt

У меня есть QListWidget, который находится в QGridLayout внутри QWizardPage. Элементы в QListWidget — это все файлы xml в каталоге. У меня все работает, кроме сигналов. Я упускаю что-то критическое, но простое, я уверен.

Я просмотрел документацию QListWidget и это и этот пост и другие. Кажется, все говорит, что itemClicked( QListWidgetItem* ) должен быть тем, что мне нужно, но он и другие не работают, т.е. моя функция new_sequence_selected никогда не вызывается. Connect также никогда не возвращает дескриптор для этого, всегда false.

Большинство сигналов, которые я пробовал, находятся в приведенном ниже коде.

Кроме того, моя кнопка просмотра работает нормально.

Дополнительная информация: Работа в Win7, VS2012, Qt5, надстройка Qt VS 1.2.2

Заранее спасибо за помощь!!

создатель.h

#include <qwizard.h>
#include <QtWidgets>
#include <QHeaderView>

class Sequence_selectPage :  public QWizardPage
{
    Q_OBJECT

public: Sequence_selectPage( QWidget *parent = 0 );

private slots:
    void browse();
private:
    QListWidget *sequenceList;
    QDir sequences_dir_path;
    QString selected_sequence;
};

создатель.cpp

#include "creator.h"

Sequence_selectPage::Sequence_selectPage( QWidget *parent ) : QWizardPage( parent )
{
    first_round = true;

    setTitle( tr( "Select an xml" ) );
    // setup path to Sequence
    sequences_dir_path.absolutePath();
    sequences_dir_path.cd( "Sequence" );


    //set up the list for the files
    sequenceList = new QListWidget( this );
    //sequenceList->setSelectionMode( QAbstractItemView::SingleSelection );
    QStringList filter;
    filter << "*.xml";

    //add xmls to list
    foreach( QString File, sequences_dir_path.entryList( filter, QDir::Files ) )      //(QStringList)"*.xml"
    {
        sequenceList->addItem( File );
    }

    if( sequenceList->count() > 0 )
    {
        sequenceList->item( 0 )->setSelected( true );
    }

    browseButton = buttonBuilder( tr( "Browse..." ), this, SLOT( browse() ) );

    /*********** Figure out this signal **********/
    connect( sequenceList, SIGNAL( sequenceList->itemClicked( QListWidgetItem* i ) ), this, SLOT( new_sequence_selected( QListWidgetItem* i) ) );
    //connect( sequenceList, SIGNAL( itemClicked( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( itemActivated( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( itemEntered( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( itemPressed( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( itemSelectionChanged( ) ), this, SLOT( new_sequence_selected( ) ) );
    //connect( sequenceList, SIGNAL( itemDoubleClicked( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( itemChanged( QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );
    //connect( sequenceList, SIGNAL( currentItemChanged( QListWidgetItem*, QListWidgetItem* ) ), this, SLOT( new_sequence_selected( QListWidgetItem* ) ) );

    selectpageLayout = new QGridLayout( this );
    selectpageLayout->addWidget( sequenceList, 0, 0, 1, 2 );
    selectpageLayout->addWidget( browseButton, 1, 1 );

    setLayout( selectpageLayout );
}

void Sequence_selectPage::new_sequence_selected( QListWidgetItem* sequence )
{
    selected_sequence = sequence->text();
}

buttonBuilder код

QPushButton *buttonBuilder( QString &button_name, QObject *receiver, const char *member )
{
    QPushButton *mybutton = new QPushButton( button_name );
    QObject::connect( mybutton, SIGNAL( clicked() ), receiver, member );
    return mybutton;
}

person progAK    schedule 02.05.2014    source источник
comment
Возвращает ли функция подключения значение true? Кстати, оператор sequences_dir_path.absolutePath(); не нужен.   -  person lpapp    schedule 03.05.2014
comment
@LaszloPapp Ни одна из попыток подключения не возвращает дескриптор, все возвращают 0.   -  person progAK    schedule 05.05.2014
comment
Вы использовали макрос Q_OBJECT внутри объявления класса?   -  person PrisonMonkeys    schedule 06.05.2014
comment
@PrisonMonkeys Да, я отредактировал сообщение, чтобы показать все #includes и определение класса.   -  person progAK    schedule 06.05.2014
comment
Попробуйте: подключить (sequenceList, SIGNAL (itemClicked (QListWidgetItem*)), this, SLOT (new_sequence_selected (QListWidgetItem*) ));   -  person ManuelH    schedule 06.05.2014
comment
@ManuelH Спасибо за предложение, но если я не упустил что-то такое же, как первое закомментированное соединение, которое я пробовал. Но я все равно попробовал, и он тоже не возвращает дескриптор.   -  person progAK    schedule 07.05.2014
comment
Попробуйте предложение @ManuelH вместе с ответом отисоноза ниже.   -  person PrisonMonkeys    schedule 07.05.2014


Ответы (1)


Вы не объявили new_sequence_selected слотом.

Попробуй это:

#include <qwizard.h>
#include <QtWidgets>
#include <QHeaderView>

class Sequence_selectPage :  public QWizardPage
{
    Q_OBJECT

public: Sequence_selectPage( QWidget *parent = 0 );

private slots:
    void browse();
    void new_sequence_selected( QListWidgetItem* sequence ); //<-- ADDED THIS
private:
    QListWidget *sequenceList;
    QDir sequences_dir_path;
    QString selected_sequence;
};
person otisonoza    schedule 06.05.2014
comment
Спасибо, я так и предполагал. - person progAK; 07.05.2014