Some questions about QIconView (или куда нада постить вопросы по QT)

Модератор: Модераторы разделов

Аватара пользователя
Jenizix
Сообщения: 53

Some questions about QIconView

Сообщение Jenizix »

OS: Linux Slackware 10.1
QT v3.3.3


1.(самое тупое и главное) - Как сделать чтобы при нажатии на кнопку вызывалась моя функция??? :wacko:
Вобщем я пишу типа Експлорера на QT и мне нада чтобы при нажатии на кнопку, вызывалась ф-ия, которая обновляет QIconView в соответствии с QLineEdit (ну типа написал путь, нажал на Go а в QIconView отобразилось содержимое папки...)
Сначала думал что это реализуется сигналами и слотами, но мне кажеться что это лишнее в моем случае... ведь можно же наверное проще... или мне всеже придется создавать мой класс от QIconEdit в котором определять метод refresh??? и уже к нему привязывать сигнал от QLineEdit ???

2. - как сделать чтобы в QIconView'е Item'ы добавлялись не слева на право и при достижении края переходили на новую строку, а чтоб добавлялись сверху вниз и переходили в новый столбик при достижении нижней границы ??? Чувствую что за это отвечает setArrangement, но никак не пойму как его юзать... :angry:

3. можно ли установить фон Бекграунда самого QIconView'а ? как?
4.(не менее важно чем п.1) - Куда постить вопросы по библиотеке QT? если я запостил не сюда, то перенесите в нужный раздел... и еще, киньте линки на форумы где могут помочь по QT...

Фууух, вроде все... Жду помощи...
Ушел в себя, вернусь не скоро...
________________________________
Slackware 10.1 / FluxBox 0.9.13
Спасибо сказали:
Аватара пользователя
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X

Re: Some questions about QIconView

Сообщение ezheg »

(Jenizix @ Среда, 22 Июня 2005, 21:40) писал(а):OS: Linux Slackware 10.1
QT v3.3.3


1.(самое тупое и главное) - Как сделать чтобы при нажатии на кнопку вызывалась моя функция??? :wacko:
Вобщем я пишу типа Експлорера на QT и мне нада чтобы при нажатии на кнопку, вызывалась ф-ия, которая обновляет QIconView в соответствии с QLineEdit (ну типа написал путь, нажал на Go а в QIconView отобразилось содержимое папки...)
Сначала думал что это реализуется сигналами и слотами, но мне кажеться что это лишнее в моем случае... ведь можно же наверное проще... или мне всеже придется создавать мой класс от QIconEdit в котором определять метод refresh??? и уже к нему привязывать сигнал от QLineEdit ???

Если я все правильно понял...то в этом случае проще написать слот! =)
Зачем что-то переопределять, когда можно написать слот, связать его с с твоей кнопкой ( сигнал clicked() ) а в этом слоте делать необходимые вещи..Как и что ты будешь делать - не знаю, мало информации. Но...
в соответствии с QLineEdit

=> используешь свойство QLineEdit->text(), анализируешь этот текст как надо, благо в Qt удобно работать со строками..и обновляешь свой QIconView...
и все в одном слоте :)

3. можно ли установить фон Бекграунда самого QIconView'а ? как?

нашел только это:

Код: Выделить всё

void QIconView::drawBackground ( QPainter * p, const QRect & r )

здесь нужно создавать класс типа QPanter, рисовать его как требуется и вставлять в QIconView
З.Ы. Сам не пробовал...

4.(не менее важно чем п.1) - Куда постить вопросы по библиотеке QT? если я запостил не сюда, то перенесите в нужный раздел... и еще, киньте линки на форумы где могут помочь по QT...

Пиши здесь, в Программировании
=)

З.Ы. Если я что-то не так или непонятно описал по первому вопросу - напиши более подробно...
Спасибо сказали:
Аватара пользователя
Jenizix
Сообщения: 53

Re: Some questions about QIconView

Сообщение Jenizix »

Для piton3000:
По первому вопросу:
Вот мой код:

Код: Выделить всё

#include <qapplication.h>
#include <qpushbutton.h>
#include <qvbox.h>
#include <qhbox.h>
#include <qiconview.h>
#include <qpixmap.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qdir.h>
#include <qlabel.h>

QLineEdit *addrtext = 0;
QVBox *mainbox = 0;
QIconView *iconview = 0;
QPixmap *pixmap = 0;

void refreshList(QString path)
{
    QDir dir(path);
  
    QStringList files = dir.entryList(QDir::Files | QDir::Hidden);
    QStringList dirs = dir.entryList(QDir::Dirs | QDir::Hidden);
    QStringList::Iterator it;
  
    it = dirs.begin();
    while (it != dirs.end()) {
  if (*it != "." && *it != "..")
      (void) new QIconViewItem(iconview,*it,*(pixmap));
  ++it;
    }

    it = files.begin();
    while (it != files.end()) {
  (void) new QIconViewItem(iconview,*it,*(pixmap));
  ++it;
    }
}

int main(int argc, char *argv[])
{
    QString path;
    QApplication app(argc, argv);

    mainbox = new QVBox(0);
    mainbox->setCaption("Jenizix's explorer");
    mainbox->setMargin(6);
    mainbox->setSpacing(6);
    mainbox->resize(600,400);
  
    QHBox *addrbox = new QHBox(mainbox);

    addrbox->setSpacing(10);
  QLabel *l_addr = new QLabel("Path : ",addrbox);
  addrtext = new QLineEdit(addrbox);
  QPushButton *gobutton = new QPushButton("Go",addrbox);
  addrtext->setText("/");
  addrtext->show();
  gobutton->show();
    addrtext->installEventFilter(addrtext);

    pixmap = new QPixmap("cpu.png");

    iconview = new QIconView(mainbox);
    iconview->setMaxItemWidth(150);
    iconview->setGridX(150);
    iconview->setItemTextPos(iconview->Right);

    /* Вот так можно менять бекграунд... */
    QPixmap *bg = new QPixmap("bg.jpg");
    iconview->setPaletteBackgroundPixmap(*(bg));
  
    refreshList(addrtext->displayText());

    iconview->setMaxItemTextLength(18);    
    app.setMainWidget(mainbox);
    mainbox->show();

    return app.exec();
}

Сильно не пинайте... я С++ тока учу... вот как мне там сделать чтоб при нажатии на gobutton или при нажатии Enter'a в addrtext вызывалась ф-ия refreshList(addrtext->displayText());
Ушел в себя, вернусь не скоро...
________________________________
Slackware 10.1 / FluxBox 0.9.13
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Some questions about QIconView

Сообщение oav »

Спасибо сказали:
Аватара пользователя
ezheg
Сообщения: 258
Статус: джидай 3-го уровня
ОС: Mac OS X

Re: Some questions about QIconView

Сообщение ezheg »

кхм..это конечно c++, но концепция сигналов-слотов - это именно особенности библиотеки Qt..
хотя я всегда во всем сомневаюсь...:)
так вот, для связывание событий ( сигналов ) с нужными функциями ( слотами ) используется функция connect;

Код: Выделить всё

connect(отправитель, SIGNAL(сигнал), получатель, SLOT(слот) )

в случае, если программа реализована в виде класса в файлах .h и .cpp (а так обычно и бывает, посмотри примеры из QT-шной доки), то где-нибудь в файле myclass.cpp, в конструкторе пишут такую байдень

Код: Выделить всё

connect(gobutton, SIGNAL( clicked() ), this, SLOT( refreshList(QString path) ) );


в твоем случае ( я бы его все-таки переделал на 2 файла, так удобней B) ) это делается непосредственным вызовом QObject::connect

Код: Выделить всё

QObject::connect(gobutton, SIGNAL( clicked() ), &app, SLOT( refreshList(QString path) ) );

если засунуть это ближе к концу файла, после объявления gobutton, то все компилится, но ругается при запуске:
QObject::connect: No such slot QApplication::refreshList(QString path)

как можно обойти это - не знаю. Поэтому единственный выход (по моему мнению) реализовать твою программу в виде класса, gobutton объявить в заголовочном файле, refreshList(QString path) объявить как слот твоего класса, типа
в заголовочном файле:

Код: Выделить всё

private slots:
 void refreshList(QString path)

в файле .cpp:

Код: Выделить всё

void my_class::refreshList(QString path){
}

и сделать connect, как я написал в первом случае...
З.Ы. Чуть не забыл, ты можешь связывать несколько сигналов с одним слотом, т.е. можешь связать события нажитя gobutton, нажатия Enter со слотом refreshList(QString path)...
Спасибо сказали: