Как компилить, как запускать и где код писать? (в QT3/ QT4)

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

Ответить
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Как компилить, как запускать и где код писать?

Сообщение Assuri »

Открыл я первую страницу книги и увидел код, но под каким расширением его сохранять, как компилить и как запустить, там не написано. Помогите, пожалуйста, новичку.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Как компилить, как запускать и где код писать?

Сообщение Liksys »

1) Создаешь каталог (имя каталога впоследствии станет именем программы) и перешодишь в него:

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

mkdir test && cd test


2) В этом каталоге создаешь файл main.cpp такого содержания (к примеру):

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

// Qt3
#include <qapplication.h>
#include <qlabel.h>

int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   QLabel *label = new QLabel("Hello, Qt3!", 0);
   app.setMainWidget(label);
   label->show();
   return app.exec();
}
или для Qt4:

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

// Qt4
#include <QApplication>
#include <QLabel>

int main(int argc, char **argv)
{
   QApplication app(argc, argv);
   QLabel *label = new QLabel("Hello, Qt4!");
   label->show();
   return app.exec();
}


4) Сохраняешь и из этого же каталога выполняешь команды:

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

qmake -project
qmake
make
Тут нужно небольшое отступление. Эти команды одинаковы и в Qt3 и в Qt4, скорее всего это команды для Qt3. Если у тебя установлен Qt4, поищи, где он находится. У меня например команды для Qt4 в /usr/local/Trolltech/Qt-4.2.2/bin/, я сделал на них ссылки в /usr/bin, назвав их qmake4, assistant4, designer4 и тд... По умолчанию у тебя наверно используется Qt3, но ты сможешь использовать и Qt4, когда установишь его и создашь ссылки. Для сборки выбери один из тех примеров выше, который подходит к твоей версии Qt.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Как компилить, как запускать и где код писать?

Сообщение Assuri »

А как скомпилировать и запустить?

UPDATE: ой. Кажется я не увидел 4 пункта или вы его позже создали.

Спасибо. Сейчас попробую.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Как компилить, как запускать и где код писать?

Сообщение Assuri »

После make вылетает ошибка:
$ make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o 1stprog.o 1stprog.cpp
1stprog.cpp:11:2: warning: no newline at end of file
1stprog.cpp: In function ‘int main(int, char**)’:
1stprog.cpp:8: error: ‘class QApplication’ has no member named ‘setMainWidget’
make: *** [1stprog.o] Error 1


Код я использовал для QT3.

У меня оказывает QT4 установлен. Поменял на код qt4, исправил некоторый опечатки и все нормально. А эти 2 строки, оказывается, не ошибки.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Как компилить, как запускать и где код писать?

Сообщение Liksys »

Значит у тебя по умолчанию используется Qt4, еще лучше. Компиль пример Qt4, а про Qt3 можешь забыть :)
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.
Контактная информация:

Re: Как компилить, как запускать и где код писать?

Сообщение eduard_pustobaev »

Но всё-таки этих вопросов не было, если бы после прочтения "Разработка графического интерфейса с помощью библиотеки Qt3". На opennet.ru точно есть. Оно хоть и для qt3, но принципы те же самые.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Как компилить, как запускать и где код писать?

Сообщение Assuri »

Вот у меня есть код:

Код:

1 #include <QApplication> 2 #include <QPushButton> 3 int main(int argc, char *argv[]) 4 { 5 QApplication app(argc, argv); 6 QPushButton *button = new QPushButton("Quit"); 7 QObject::connect(button, SIGNAL(clicked()), 8 &app, SLOT(quit())); 9 button->show(); 10 return app.exec(); 11 }

файл с этим кодом находится в папке "3rd"
Я проделываю следующие действия:
1. qmake -project
2. qmake 3rd.pro
3. make
И выдается следующее:
make.cpp:1:28: warning: extra tokens at end of #include directive
make.cpp:11:2: warning: no newline at end of file
make.cpp: In function ‘int main(int, char**)’:
make.cpp:5: error: ‘QPushButton’ was not declared in this scope
make.cpp:5: error: ‘button’ was not declared in this scope
make.cpp:5: error: expected type-specifier before ‘QPushButton’
make.cpp:5: error: expected `;' before ‘QPushButton’
make: *** [make.o] Error 1

В чем проблема?
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Как компилить, как запускать и где код писать?

Сообщение nerezus »

В чем проблема?
Ну типа нажми <Enter> посередине 1ой строки.
ICQ 547097
Спасибо сказали:
Аватара пользователя
Assuri
Сообщения: 678
Статус: #include <brain.h>
ОС: Fedora 12
Контактная информация:

Re: Как компилить, как запускать и где код писать?

Сообщение Assuri »

nerezus писал(а):
13.05.2007 18:28
Ну типа нажми <Enter> посередине 1ой строки.

Точно. Не знаю почему, но я этого даже и не заметил - так бы и сам исправил.
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Как компилить, как запускать и где код писать?

Сообщение nerezus »

Твоя проблема в том. что компилятор ясно указал, где ошибка, а ты совсем не читаешь, что он тебе пишет.
ICQ 547097
Спасибо сказали:
Nark
Сообщения: 21

Re: Как компилить, как запускать и где код писать?

Сообщение Nark »

А у меня вот такая проблема...

Решил я попробовать самый первый пример из книги скомпилить:

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

#include <qapplication.h>
#include <qlabel.h>

int main(int argc, char *argv[])
{
    Qapplication app(argc, argv);
    Qlabel * label = new Qlabel("Hello, Qt!", 0);
    app.setMainWidget(label);
    label->show();
    return app.exec();
}


после этого выполняю:

nark@cremator

$qmake -project -o hello.pro $qmake hello.pro $make


компилятор выдает:

nark@cremator

c++ -c -pipe -Wall -W -O2 -pipe -march=athlon-mp -fconserve-space -DQT_NO_DEBUG -DQT_THREAD_SUPPORT-DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/local/share/qt/mkspecs/freebsd-g++ -I. -I. -I/usr/local/include -I/usr/local/include -o hello.o hello.cpp hello.cpp: In function `int main(int, char**)': hello.cpp:6: error: `Qapplication' was not declared in this scope hello.cpp:6: error: expected `;' before "app" hello.cpp:7: error: `Qlabel' was not declared in this scope hello.cpp:7: error: `label' was not declared in this scope hello.cpp:7: error: `Qlabel' is not a type hello.cpp:8: error: `app' was not declared in this scope hello.cpp:6: warning: unused variable 'Qapplication' hello.cpp:7: warning: unused variable 'Qlabel' hello.cpp: At global scope: hello.cpp:5: warning: unused parameter 'argc' hello.cpp:5: warning: unused parameter 'argv' *** Error code 1 Stop in /home/nark/projects/c++/qt3.


В чем загвоздка не пойму!!!

Система: FreeBSD 6.2-RELEASE.

Переменные окружения:
QMAKESPEC=/usr/local/share/qt/mkspecs/freebsd-g++
QTDIR=/usr/local

Вот переменные из сгенерированного Makefile:

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

#############################################################################
# Makefile for building: hello
# Generated by qmake (1.07a) (Qt 3.3.8) on: Mon Dec 10 02:38:05 2007
# Project:  hello.pro
# Template: app
# Command: $(QMAKE) -o Makefile hello.pro
#############################################################################

####### Compiler, tools and options

CC       = cc
CXX      = c++
LEX      = flex
YACC     = yacc
CFLAGS   = -pipe -Wall -W -O2 -pipe -march=athlon-mp -fconserve-space  -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT
CXXFLAGS = -pipe -Wall -W -O2 -pipe -march=athlon-mp -fconserve-space  -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT
LEXFLAGS =
YACCFLAGS= -d
INCPATH  = -I/usr/local/share/qt/mkspecs/freebsd-g++ -I. -I. -I/usr/local/include -I$(QTDIR)/include
LINK     = c++
LFLAGS   =  -Wl,-rpath,/usr/local/lib  -Wl,-rpath,$(QTDIR)/lib -pthread
LIBS     = $(SUBLIBS) -L/usr/local/lib -L$(QTDIR)/lib -L/usr/local/lib -lqt-mt -lXext -lX11 -lm
AR       = ar cqs
RANLIB   =
MOC      = $(QTDIR)/bin/moc
UIC      = $(QTDIR)/bin/uic
QMAKE    = qmake
TAR      = tar -cf
GZIP     = gzip -9f
COPY     = cp -f
COPY_FILE= $(COPY)
COPY_DIR = $(COPY) -R
INSTALL_FILE= $(COPY_FILE)
INSTALL_DIR = $(COPY_DIR)
DEL_FILE = rm -f
SYMLINK  = ln -sf
DEL_DIR  = rmdir
MOVE     = mv -f
CHK_DIR_EXISTS= test -d
MKDIR    = mkdir -p

####### Output directory

OBJECTS_DIR = ./

####### Files

HEADERS =
SOURCES = hello.cpp
OBJECTS = hello.o
FORMS =
UICDECLS =
UICIMPLS =
SRCMOC   =
OBJMOC =
DIST       = hello.pro
QMAKE_TARGET = hello
DESTDIR  =
TARGET   = hello


Файлы qapplication.h и qlabel.h компилер находит (я пробовал ради эксперимента запускать $c++ -o hello hello.cpp, тогда компилер явно указывает на отсутствие заголовков, а с использованием опции -I/usr/local/include он выдает тоже самое, что и make)

Просмотрел qapplication.h и qlabel.h - там Qapplication и Qlabel объявлены....

Поискал в нете - там описываются либо другие проблемы, либо все у всех получается...

Подскажите, плз, что я упустил? Моя логика зашла в тупик...

P.S. Все Qt-приложения из портов компилятся и запускаются без проблем! Ананас тоже собрался!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Как компилить, как запускать и где код писать?

Сообщение Uncle_Theodore »

А они, случаем, не QApplication и не QLabel (большие буквы)? :unsure:
Спасибо сказали:
Nark
Сообщения: 21

Re: Как компилить, как запускать и где код писать?

Сообщение Nark »

в /usr/local/include у меня находятся qapplication.h и qlabel.h
И вышеописанный вывод компилятора выводится при вышеописанном варианте исходника.
Если же я как-либо меняю директивы подключения заголовков, например так:

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

#include <QApplication>
#include <QLabel>

то вот что выводит компилятор:

nark@cremator

c++ -c -pipe -Wall -W -O2 -pipe -march=athlon-mp -fconserve-space -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/local/share/qt/mkspecs/freebsd-g++ -I. -I. -I/usr/local/include -I/usr/local/include -o hello.o hello.cpp hello.cpp:1:24: QApplication: No such file or directory hello.cpp:2:18: QLabel: No such file or directory hello.cpp: In function `int main(int, char**)': hello.cpp:6: error: `Qapplication' was not declared in this scope hello.cpp:6: error: expected `;' before "app" hello.cpp:7: error: `Qlabel' was not declared in this scope hello.cpp:7: error: `label' was not declared in this scope hello.cpp:7: error: `Qlabel' is not a type hello.cpp:8: error: `app' was not declared in this scope hello.cpp:6: warning: unused variable 'Qapplication' hello.cpp:7: warning: unused variable 'Qlabel' hello.cpp: At global scope: hello.cpp:5: warning: unused parameter 'argc' hello.cpp:5: warning: unused parameter 'argv' *** Error code 1 Stop in /home/nark/projects/c++/qt3.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Как компилить, как запускать и где код писать?

Сообщение Uncle_Theodore »

Я не про хедеры, а про то, что у Вас в программе написано.

Попробуйте заменить

Qapplication app(argc, argv);
Qlabel * label = new Qlabel("Hello, Qt!", 0);

на

QApplication app(argc, argv);
QLabel * label = new QLabel("Hello, Qt!", 0);
Спасибо сказали:
Nark
Сообщения: 21

Re: Как компилить, как запускать и где код писать?

Сообщение Nark »

Спасибо огромное, Uncle_Theodore :)
И куда мои глаза смотрели? Ведь просматривал и хедеры и assistant смотрел... :blush:
Все получилось!
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

помогите разобраться как работать правильно со слотами и сигналами, ведь кроме стандартных слов можно писать и свои? вот допустим есть примитивный код:

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

#include<QApplication>
#include<QtGui>
#include<QObject>
#include<iostream>
using namespace std;
QLabel *label;
QLineEdit *edit;
QObject::slots:
    void get_text();
int main(int argc, char**argv)
{
    QApplication app(argc, argv);
    QWidget *window = new QWidget;
    window->setWindowTitle("my not first Qt4 application");
    label = new QLabel("this is label");
    QPushButton *button = new QPushButton("set text on label");
    QPushButton *button_for_close = new QPushButton("close");
    edit = new QLineEdit;
    QVBoxLayout *layout1 = new QVBoxLayout;
    QVBoxLayout *layout2 = new QVBoxLayout;
    QHBoxLayout *mainLayout = new QHBoxLayout;
    layout1->addWidget(label);
    layout1->addWidget(edit);
    layout2->addWidget(button);
    layout2->addWidget(button_for_close);
    mainLayout->addLayout(layout1);
    mainLayout->addLayout(layout2);
    QObject::connect(button, SIGNAL(clicked()), label, SLOT(get_text()));
    QObject::connect(button_for_close, SIGNAL(clicked()), window, SLOT(close()));

    window->setLayout(mainLayout);

    window->show();
    cout<<"finished";

    return app.exec();
}
void get_text(){
    label->setText(edit->text());
}


при сборке оно ругается:
main.cpp:8: error: expected unqualified-id before ‘:’ token

то есть на обьявление слота :console:
В чем проблемма?
Спасибо сказали:
Nark
Сообщения: 21

Re: Как компилить, как запускать и где код писать?

Сообщение Nark »

chups писал(а):
12.12.2007 21:32
при сборке оно ругается:

main.cpp:8: error: expected unqualified-id before ‘:’ token

то есть на обьявление слота :console:
В чем проблемма?


Я сам только недавно начал изучать C++ и Qt...
Может я и не прав, но я так понял, что слоты являются членами классов. То есть сначала нужно объявить свой класс в качестве наследника того класса, в котором есть слоты, а в нем уже создавать слот. А в Вашем примере в восьмой строке слот объявляется вне класса.

P.S. Если я не прав, то буду благодарен за развернутый ответ.
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Как компилить, как запускать и где код писать?

Сообщение Olegator »

я тоже начинающий Qt-шник, советую делать в таком стиле:
edittolabel.h

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

#ifndef EDITTOLABEL_H
#define EDITTOLABEL_H

#include <QWidget>
class QLineEdit;
class QLabel;
class QPushButton;
class EditToLabel : public QWidget
{
    Q_OBJECT

public:
    EditToLabel(QWidget *parent = 0);
    ~EditToLabel();

private:
    QLabel *textLabel;
    QLineEdit *lineEdit;
    QPushButton *closeButton;
    QPushButton *textToLabelButton;
private slots:
    void setTextToLabel();
};
#endif // EDITTOLABEL_H

edittolabel.cpp

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

#include "edittolabel.h"
#include <QtGui>

EditToLabel::EditToLabel(QWidget *parent)
    : QWidget(parent)
{
    textLabel = new QLabel(tr("Some thing"));
    lineEdit = new QLineEdit;
    textToLabelButton = new QPushButton(tr("&Set text to label"));
    connect(textToLabelButton,SIGNAL(clicked()),this,SLOT(setTextToLabel()));
    closeButton = new QPushButton(tr("&Close"));
    connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
    QVBoxLayout *layout1 = new QVBoxLayout;
    QVBoxLayout *layout2 = new QVBoxLayout;
    QHBoxLayout *mainLayout = new QHBoxLayout;
    layout1->addWidget(textLabel);
    layout1->addWidget(lineEdit);
    layout2->addWidget(textToLabelButton);
    layout2->addWidget(closeButton);
    mainLayout->addLayout(layout1);
    mainLayout->addLayout(layout2);
    setLayout(mainLayout);

}

void EditToLabel::setTextToLabel()
{
    textLabel->setText(lineEdit->text());
}

EditToLabel::~EditToLabel()
{

}

main.cpp

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

#include "edittolabel.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    EditToLabel w;
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Как компилить, как запускать и где код писать?

Сообщение Olegator »

и ещё совет - есть хорошая книжка "Qt4: программирование GUI на c++", советую начать с неё, помойму есть в нете в электронном виде
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

Nark, Olegator спасибо за советы :) . тот код что вы привели в пример я в принципе понял, кроме одного:
connect(textToLabelButton,SIGNAL(clicked()),this,SLOT(setTextToLabel()));


а именно что делает this? что это за слово и как оно работает я теоретически представляю, но до сих пор у меня с ним не получается, еще с изучения java :wacko: . оно, что в данном случае ссылается на lineEdit? вообщем, если можно, растолкуйте

а на счет книги, то она у меня есть и я по ней и изучаю Qt4(ну плюс assistant):)
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Как компилить, как запускать и где код писать?

Сообщение Olegator »

chups писал(а):
13.12.2007 15:11
Nark, Olegator спасибо за советы :) . тот код что вы привели в пример я в принципе понял, кроме одного:
connect(textToLabelButton,SIGNAL(clicked()),this,SLOT(setTextToLabel()));


а именно что делает this? что это за слово и как оно работает я теоретически представляю, но до сих пор у меня с ним не получается, еще с изучения java :wacko: . оно, что в данном случае ссылается на lineEdit? вообщем, если можно, растолкуйте

а на счет книги, то она у меня есть и я по ней и изучаю Qt4(ну плюс assistant):)

this, это указатель на текущий объект, в данном случае будет возвращён указатель на объект класса EditToLabel. смысл примерно такой. и почитайте книжку по C++. на lineedit ничего не ссылается, мы в классе EditToLabel создали свой слот setTextToLabel(), который выполняет следующие textLabel->setText(lineEdit->text()) и связывается с сигналом clicked() компонента textToLabelButton
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

что у меня не получается с этими слотами-сигналами, вот код:
main.cpp

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

#include<QtCore>
#include<QtGui>
#include "ui_finder.h"
#include "tree.h"

int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    Ui::finder find;
    QWidget *main_window;
    main_window = new QWidget;
    find.setupUi(main_window);
    //Tree tr(main_window);
    main_window->show();

    return a.exec();
}


tree.h

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

#ifndef TREE_H
#define TREE_H

#include<QWidget>
#include<QPushButton>

class Tree : public QWidget
{
    Q_OBJECT
public:
    Tree(QWidget *parent=0);
    //~Tree();
    void setButton(QPushButton *pushButton);

private slots:
        void getTree();

private:
    QDirModel *model;
    QTreeView *tree;
    QPushButton *button;
};
#endif//TREE_H


tree.cpp

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

#include "tree.h"
#include<QtGui>

Tree::Tree(QWidget *parent):QWidget(parent)
{
    QObject::connect(button, SIGNAL(clicked()), this, SLOT(getTree()));
}

void Tree::getTree()
{
    model = new QDirModel;
    tree = new QTreeView;
    tree->setModel(model);
    tree->setWindowTitle(QObject::tr("Dir View"));
    tree->resize(640, 480);
    tree->show();
}

/*void Tree::setButton(QPushButton *pushButton)
{
    button = pushButton;
}
Tree::~Tree()
{

}*/


ну и за одно созданый в Qt Desinger ui_finder.h

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

/********************************************************************************
** Form generated from reading ui file 'finder.ui'
**
** Created: Вс дек. 16 20:16:41 2007
**      by: Qt User Interface Compiler version 4.3.1
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_FINDER_H
#define UI_FINDER_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QFrame>
#include <QtGui/QHBoxLayout>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QPushButton>
#include <QtGui/QTextEdit>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

class Ui_finder
{
public:
    QVBoxLayout *vboxLayout;
    QVBoxLayout *vboxLayout1;
    QLabel *label_name_of_file;
    QLineEdit *lineEdit_name_of_file;
    QFrame *line;
    QLabel *label_path;
    QHBoxLayout *hboxLayout;
    QLineEdit *lineEdit_path;
    QPushButton *chooseButton;
    QFrame *line_2;
    QLabel *label_result;
    QTextEdit *textEdit_result;
    QHBoxLayout *hboxLayout1;
    QPushButton *findButton;
    QPushButton *cancelButton;
    QPushButton *quitButton;

    void setupUi(QWidget *finder)
    {
    if (finder->objectName().isEmpty())
        finder->setObjectName(QString::fromUtf8("finder"));
    finder->resize(486, 292);
    vboxLayout = new QVBoxLayout(finder);
    vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
    vboxLayout1 = new QVBoxLayout();
    vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1"));
    label_name_of_file = new QLabel(finder);
    label_name_of_file->setObjectName(QString::fromUtf8("label_name_of_file"));

    vboxLayout1->addWidget(label_name_of_file);

    lineEdit_name_of_file = new QLineEdit(finder);
    lineEdit_name_of_file->setObjectName(QString::fromUtf8("lineEdit_name_of_file"));

    vboxLayout1->addWidget(lineEdit_name_of_file);


    vboxLayout->addLayout(vboxLayout1);

    line = new QFrame(finder);
    line->setObjectName(QString::fromUtf8("line"));
    line->setFrameShape(QFrame::HLine);
    line->setFrameShadow(QFrame::Sunken);

    vboxLayout->addWidget(line);

    label_path = new QLabel(finder);
    label_path->setObjectName(QString::fromUtf8("label_path"));

    vboxLayout->addWidget(label_path);

    hboxLayout = new QHBoxLayout();
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    lineEdit_path = new QLineEdit(finder);
    lineEdit_path->setObjectName(QString::fromUtf8("lineEdit_path"));

    hboxLayout->addWidget(lineEdit_path);

    chooseButton = new QPushButton(finder);
    chooseButton->setObjectName(QString::fromUtf8("chooseButton"));

    hboxLayout->addWidget(chooseButton);


    vboxLayout->addLayout(hboxLayout);

    line_2 = new QFrame(finder);
    line_2->setObjectName(QString::fromUtf8("line_2"));
    line_2->setFrameShape(QFrame::HLine);
    line_2->setFrameShadow(QFrame::Sunken);

    vboxLayout->addWidget(line_2);

    label_result = new QLabel(finder);
    label_result->setObjectName(QString::fromUtf8("label_result"));

    vboxLayout->addWidget(label_result);

    textEdit_result = new QTextEdit(finder);
    textEdit_result->setObjectName(QString::fromUtf8("textEdit_result"));
    textEdit_result->setReadOnly(true);

    vboxLayout->addWidget(textEdit_result);

    hboxLayout1 = new QHBoxLayout();
    hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1"));
    findButton = new QPushButton(finder);
    findButton->setObjectName(QString::fromUtf8("findButton"));
    findButton->setEnabled(false);

    hboxLayout1->addWidget(findButton);

    cancelButton = new QPushButton(finder);
    cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
    cancelButton->setEnabled(false);

    hboxLayout1->addWidget(cancelButton);

    quitButton = new QPushButton(finder);
    quitButton->setObjectName(QString::fromUtf8("quitButton"));

    hboxLayout1->addWidget(quitButton);


    vboxLayout->addLayout(hboxLayout1);

    label_name_of_file->setBuddy(lineEdit_name_of_file);
    label_path->setBuddy(lineEdit_path);

    retranslateUi(finder);
    QObject::connect(quitButton, SIGNAL(clicked()), finder, SLOT(close()));

    QMetaObject::connectSlotsByName(finder);
    } // setupUi

    void retranslateUi(QWidget *finder)
    {
    finder->setWindowTitle(QApplication::translate("finder", "CrossFinder", 0, QApplication::UnicodeUTF8));
    label_name_of_file->setText(QApplication::translate("finder", "E&nter what you want to find", 0, QApplication::UnicodeUTF8));
    label_path->setText(QApplication::translate("finder", "Enter &path where you want to find", 0, QApplication::UnicodeUTF8));
    chooseButton->setText(QApplication::translate("finder", "&choose where to find", 0, QApplication::UnicodeUTF8));
    label_result->setText(QApplication::translate("finder", "result of finding", 0, QApplication::UnicodeUTF8));
    findButton->setText(QApplication::translate("finder", "find", 0, QApplication::UnicodeUTF8));
    cancelButton->setText(QApplication::translate("finder", "cancel", 0, QApplication::UnicodeUTF8));
    quitButton->setText(QApplication::translate("finder", "quit", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(finder);
    } // retranslateUi

};

namespace Ui {
    class finder: public Ui_finder {};
} // namespace Ui

#endif // UI_FINDER_H

то что я накидал в дизайнере собирается спокойно, только я добавляю обьявление класса Tree и пытаюсь его подключить к кнопке, то вылезают ошибки(по щелчку на кнопку должно выскакивать окошко с построеным деревом ФС). как это все правильно реализуется?

P.S. извиняюсь за детские, может быть, вопросы:)
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Как компилить, как запускать и где код писать?

Сообщение Olegator »

ну вы даёте! вроде и книжка есть, а такое ошущение что вы её не открывали :). и так по порядку, вот код который генерирует редактор форм:
ui_finder.h

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

/********************************************************************************
** Form generated from reading ui file 'finder.ui'
**
** Created: Mon 17. Dec 12:48:25 2007
**      by: Qt User Interface Compiler version 4.3.3
**
** WARNING! All changes made in this file will be lost when recompiling ui file!
********************************************************************************/

#ifndef UI_FINDER_H
#define UI_FINDER_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

class Ui_finderClass
{
public:
    QVBoxLayout *vboxLayout;
    QHBoxLayout *hboxLayout;
    QPushButton *showTreeButton;
    QPushButton *closeButton;

    void setupUi(QWidget *finderClass)
    {
    if (finderClass->objectName().isEmpty())
        finderClass->setObjectName(QString::fromUtf8("finderClass"));
    finderClass->resize(176, 69);
    vboxLayout = new QVBoxLayout(finderClass);
    vboxLayout->setSpacing(6);
    vboxLayout->setMargin(11);
    vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
    hboxLayout = new QHBoxLayout();
    hboxLayout->setSpacing(6);
    hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
    showTreeButton = new QPushButton(finderClass);
    showTreeButton->setObjectName(QString::fromUtf8("showTreeButton"));

    hboxLayout->addWidget(showTreeButton);

    closeButton = new QPushButton(finderClass);
    closeButton->setObjectName(QString::fromUtf8("closeButton"));

    hboxLayout->addWidget(closeButton);


    vboxLayout->addLayout(hboxLayout);


    retranslateUi(finderClass);
    QObject::connect(closeButton, SIGNAL(clicked()), finderClass, SLOT(close()));

    QMetaObject::connectSlotsByName(finderClass);
    } // setupUi

    void retranslateUi(QWidget *finderClass)
    {
    finderClass->setWindowTitle(QApplication::translate("finderClass", "finder", 0, QApplication::UnicodeUTF8));
    showTreeButton->setText(QApplication::translate("finderClass", "&ShowTree", 0, QApplication::UnicodeUTF8));
    closeButton->setText(QApplication::translate("finderClass", "&Close", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(finderClass);
    } // retranslateUi

};

namespace Ui {
    class finderClass: public Ui_finderClass {};
} // namespace Ui

#endif // UI_FINDER_H

чтобы удобно получать доступ к объектам и свойствам класса finderClass, нужно сделать множественное наследование:
finder.h

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

#ifndef FINDER_H
#define FINDER_H

#include <QWidget>
#include "ui_finder.h"
class QDirModel;
class QTreeView;
class finder : public QWidget,
           public Ui::finderClass
{
    Q_OBJECT

public:
    finder(QWidget *parent = 0);
    ~finder();
private slots:
    void getTreeView();
private:
    QDirModel *model;
    QTreeView *tree;
};

#endif // FINDER_H

теперь мы можем напрямую обращаться к объектам класса, сгенерированного в графическом редакторе.
обратите внимание что мы объявляем два класса class QDirModel и class QTreeView, так как в #include <QWidget> описаний их не содержиться, описание содержиться в #include <QtGui>, но он очень большой и поэтому включать его в заголовочный файл не желательно.
finder.cpp

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

#include "finder.h"
#include <QtGui>
finder::finder(QWidget *parent)
    : QWidget(parent)
{
    setupUi(this);
    connect(showTreeButton,SIGNAL(clicked()),this,SLOT(getTreeView()));
    tree=0;
}

void finder::getTreeView()
{
    if(!tree)
    {
        model = new QDirModel;
        tree = new QTreeView;
        tree->setModel(model);
        tree->setWindowTitle(tr("Dir View"));
    }
    tree->show();
}

finder::~finder()
{

}

обратите внимание что мы здесь проверяем существование указателя на объект класса QTreeView, если его нет то мы его создаём, а у вас он в любом случае создаётся даже если уже и существует
main.cpp

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

#include "finder.h"

#include <QtGui>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    finder w;
    w.show();
    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    return a.exec();
}
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

Olegator, большое спасибо, извиняюсь за несколько поздный ответ, во многом ваш пост мне помог(книгу стал чаще открывать:)), но появилась одна проблема, пока не могу понять как с ней справиться.

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

                QModelIndex currentIndex = tree->currentIndex();
    if(!currentIndex.isValid())
        return;
    path = new QString(model->filePath(currentIndex));
    //const QString *path_to_edit = new QString(path);
    //lineEdit_path->insert(path); //error!!


Выдает ошибку:

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

finder.cpp:68: error: no matching function for call to ‘QLineEdit::insert(QString*&)’
/usr/include/QtGui/QLineEdit:169: note: candidates are: void QLineEdit::insert(const QString&)


Здесь я получаю, строку QString path, я хочу ее установить в lineEdit_path(экземпляр типа QLineEdit), но вот в чем проблема: метод insert() требует в качестве параметров const QString. как обычный QString "преобразовать" в const QString? я что-то не пойму. обьясните пожалуста
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

сам спросил - сам и решил проблему, просто нужно было сделать вот так:

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

path = model->filePath(currentIndex);

и обьявить не указатель на строку(как я сделал), а просто:

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

QString path;

может это не самое изящное решение, но у меня так работает:)
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Как компилить, как запускать и где код писать?

Сообщение Olegator »

finder.cpp:68: error: no matching function for call to ‘QLineEdit::insert(QString*&)’
/usr/include/QtGui/QLineEdit:169: note: candidates are: void QLineEdit::insert(const QString&)

вам компилятор всё написал, просто вы пытались запихнуть указатель на строку, а метод insert требует саму строку, кстати строка обычно создаётся как объект, а не через указатель. Но если вы уж решили сделать как указатель, то надо было в методе insert разименовать указатель:
lineEdit_path->insert(*path);
и посмотрите ещё книжку по С++ "Лафоре Р. Объектно-ориентированное програмирование в C++"(где-то есть в электронном виде), а то вы с таким потходом ничего хорошего не напишите :)
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

я впринципе С++ практически не знаю:), а более-менее знаю java. знаю что для успешного освоения Qt нужен С++, но пока не имею времени на изучение - сесия:), но в следуещем году обещаю исправится ;)
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Как компилить, как запускать и где код писать?

Сообщение Liksys »

chups, попробуй Python и PyQt4. Связка реально рулит, причем Python на базовом уровне можно выучить за пару вечеров.
Спасибо сказали:
Аватара пользователя
chups
Сообщения: 79
ОС: Debian Lenny GNU/Linux

Re: Как компилить, как запускать и где код писать?

Сообщение chups »

спасибо за совет, но как-то попробовал ради интереса почитать книгу о Python, чесно говоря не очень понравилось, но это было давно, а в Qt4 я уже вьехал, курсовик по програмированию сдал на 100 балов, не без помощи этого раздела:)
Спасибо сказали:
Ответить