Russian Qt Forum
Ноябрь 25, 2024, 02:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: extern QListWidget  (Прочитано 6453 раз)
Q6HKi
Гость
« : Март 19, 2010, 22:24 »

Здравствуйте!
Помогите решить проблему: нужно вне функции main() иметь доступ к объекту QListWidget для вызова selectedItems(), для этого объявляю extern QListWidget, но программа завершатся руганью как на картинке. Как это исправить?

Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Март 19, 2010, 22:37 »

>>нужно вне функции main() иметь доступ к объекту QListWidget
Что значит "вне функции main()"? до неё?
Записан

Юра.
Q6HKi
Гость
« Ответ #2 : Март 19, 2010, 22:47 »

Нет, в другом файле, в определении слота. Забыл написать, сам QListWidget определен в main()
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Март 19, 2010, 23:53 »

>>Нет, в другом файле, в определении слота. Забыл написать, сам QListWidget определен в main()
у меня две мысли:
1) Ты явно не понимаешь элементарных вещей в С++/Qt, поэтому чего-то намудрил
2) Ты очень сильно шаришь и замыслил что-то не тривиальное.

Поэтому, расскажи что тебе нужно, а не как ты пытаешься что-то реализовать
Записан

Юра.
Q6HKi
Гость
« Ответ #4 : Март 20, 2010, 03:01 »

Скорее первое, чем второе  Веселый
Программа должна составлять плейлист *.m3u(т.е. вывод пути каждого файла построчно в файл плейлиста). Список файлов выводится в QListWidget, где их можно выбрать и нажать кнопку "Создать". Собственно, уже в программе это можно сделать, НО сигнал currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous ) отслеживает изменение выбора только одного элемента, поэтому при нажатии Ctrl+A, Shift+PgDown и т.д. добавляются только первый и последний элементы. Решение этой проблемы я вижу в selectedItems(), но, как уже писал выше, она не работает
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Март 20, 2010, 13:17 »

приведи код файла main.cpp
Записан

Юра.
Q6HKi
Гость
« Ответ #6 : Март 20, 2010, 14:29 »

Код:
#include <QtGui/QApplication>
#include <QDir>
#include <QFile>
#include <QWidget>
#include <QLabel>
#include <QList>
#include <QBoxLayout>
#include <QListWidget>
#include <QObject>
#include <QListWidgetItem>
#include <iostream>
#include <QTextStream>
#include <QFileInfo>
#include <QPushButton>
#include "ListWidgetItem.h"

QString *path = new QString("C:/Users/Q6HKi/Desktop/Download/Infected Mushroom - Discography");
QString *m3uFile = new QString("C:/Users/Q6HKi/Desktop/file.m3u");

QStringList *files = new QStringList();

static QStringList filesToListF( QString* inPath, QString inFilter){
    QDir *dir = new QDir(*inPath);
    QStringList *filter = new QStringList(inFilter);
    QStringList files( dir->entryList( *filter, QDir::Files, QDir::Name) );
    return files;
}

static QStringList filesList( QString* inPath, QString inFilter){
    QDir *dir = new QDir(*inPath);
    QStringList *filter = new QStringList(inFilter);
    QFileInfoList *infoList = new QFileInfoList();
    infoList->append( dir->entryInfoList( *filter, QDir::Files, QDir::Name) );
    QStringList files;
    for( int i = 0; i < infoList->count(); i++ ){
        files.append( (*infoList)[i].absoluteFilePath() );
    }
    return files;
}

static QStringList folderList(QString* inPath){
    QDir *dir = new QDir(*inPath);
    QList<QString> files( dir->entryList( QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name) );
    for( int i = 0; i < (files.count()); i++){
        (files[i]).prepend(*inPath + "/");
    }
    return files;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QVBoxLayout *vlay = new QVBoxLayout();

    QStringList *folders = new QStringList( *path );
    for( int i = 0; i < folders->count(); i++ ){
        folders->append( folderList( &(*folders)[i] ) );
    }

    for( int i = 0; i < folders->count(); i++ ){
        files->append( filesList( &(*folders)[i], "*.mp3") );
    }

    QStringList *filesToList = new QStringList();
    for( int i = 0; i < folders->count(); i++ ){
        filesToList->append( filesToListF( &(*folders)[i], "*.mp3") );
    }

    QLabel *currPath = new QLabel();
    currPath->setText( *path );
    vlay->addWidget(currPath);

    QLabel *foldersNum = new QLabel();
    QString *foldersNumStr = new QString();
    foldersNumStr->setNum(folders->count());
    foldersNum->setText( *foldersNumStr + " folders" );
    vlay->addWidget(foldersNum);

    QLabel *filesNum = new QLabel();
    QString *filesNumStr = new QString();
    filesNumStr->setNum(files->count());
    filesNum->setText( *filesNumStr + " files" );
    vlay->addWidget(filesNum);

    QListWidget *listW = new QListWidget();                                      //Нужно сделать внешней
    listW->setSelectionMode(QAbstractItemView::ExtendedSelection);
    QList<QListWidgetItem *> listItem;
    for( int i = 0; i < (filesToList->count()); i++){
        listItem << new QListWidgetItem( (*filesToList)[i], listW);
    }
    for( int i = 0; i < (files->count()); i++){
        listItem[i]->setToolTip( (*files)[i] ); ;
    }
    vlay->addWidget(listW);

    QPushButton *makeListB = new QPushButton("Make playlist");
    vlay->addWidget(makeListB);

    ListWidgetItem *tt = new ListWidgetItem();                                   //Наследный класс QListWidgetItem, где объявляются слоты, в которых и нужно иметь доступ к QListWidget *listW
    QObject::connect( listW, SIGNAL( currentItemChanged(QListWidgetItem*,QListWidgetItem*) ), tt, SLOT( itemReceive(QListWidgetItem*,QListWidgetItem*) ) );
    QObject::connect( makeListB, SIGNAL(clicked()), tt, SLOT(makeList()) );

    QWidget *window = new QWidget();
    window->setLayout(vlay);
    window->resize(500,500);
    window->show();

    return a.exec();
}
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Март 20, 2010, 15:20 »

на с++ обычно всё-таки всё в мейне не пишут. Надо бы вынести всё в отдельный класс (наследник от QWidget)
сделть метод для доступа к listW и использовать этот метод откуда надо, подключив хедер нового класса
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Март 20, 2010, 15:31 »

К словам Аварона, добавлю лишь:
Стоит посмотреть примеры Qt в каталоге %QTDIR%/examples и учебные пособия.
Особенно обрати внимание на Учебное пособие по виджетам

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

>>Решение этой проблемы я вижу в selectedItems(), но, как уже писал выше, она не работает
при создании класса окна (как сказал Аварон, наследника QWidget'a) проблемы вообще не возникнет.
Записан

Юра.
Q6HKi
Гость
« Ответ #9 : Март 20, 2010, 15:52 »

Благодарю за совет, попробую так сделать. А из учебных пособий в основном использую встроенный справочник в QCreator, иногда гугл.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Март 20, 2010, 16:40 »

там в справке есть раздел examples
вообще даже есть спец программа Qt Demo - сами экзамплы и документация к ним
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.058 секунд. Запросов: 22.