Как компилить, как запускать и где код писать? (в QT3/ QT4)
Модератор: Модераторы разделов
Как компилить, как запускать и где код писать?
Открыл я первую страницу книги и увидел код, но под каким расширением его сохранять, как компилить и как запустить, там не написано. Помогите, пожалуйста, новичку.
Re: Как компилить, как запускать и где код писать?
1) Создаешь каталог (имя каталога впоследствии станет именем программы) и перешодишь в него:
2) В этом каталоге создаешь файл main.cpp такого содержания (к примеру):
или для Qt4:
4) Сохраняешь и из этого же каталога выполняешь команды:
Тут нужно небольшое отступление. Эти команды одинаковы и в Qt3 и в Qt4, скорее всего это команды для Qt3. Если у тебя установлен Qt4, поищи, где он находится. У меня например команды для Qt4 в /usr/local/Trolltech/Qt-4.2.2/bin/, я сделал на них ссылки в /usr/bin, назвав их qmake4, assistant4, designer4 и тд... По умолчанию у тебя наверно используется Qt3, но ты сможешь использовать и Qt4, когда установишь его и создашь ссылки. Для сборки выбери один из тех примеров выше, который подходит к твоей версии Qt.
Код: Выделить всё
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
#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
Re: Как компилить, как запускать и где код писать?
А как скомпилировать и запустить?
UPDATE: ой. Кажется я не увидел 4 пункта или вы его позже создали.
Спасибо. Сейчас попробую.
UPDATE: ой. Кажется я не увидел 4 пункта или вы его позже создали.
Спасибо. Сейчас попробую.
Re: Как компилить, как запускать и где код писать?
После make вылетает ошибка:
Код я использовал для QT3.
У меня оказывает QT4 установлен. Поменял на код qt4, исправил некоторый опечатки и все нормально. А эти 2 строки, оказывается, не ошибки.
$ 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 строки, оказывается, не ошибки.
Re: Как компилить, как запускать и где код писать?
Значит у тебя по умолчанию используется Qt4, еще лучше. Компиль пример Qt4, а про Qt3 можешь забыть
- eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
- Контактная информация:
Re: Как компилить, как запускать и где код писать?
Но всё-таки этих вопросов не было, если бы после прочтения "Разработка графического интерфейса с помощью библиотеки Qt3". На opennet.ru точно есть. Оно хоть и для qt3, но принципы те же самые.
В дисгармонии со вселенной.
Re: Как компилить, как запускать и где код писать?
Вот у меня есть код:
файл с этим кодом находится в папке "3rd"
Я проделываю следующие действия:
1. qmake -project
2. qmake 3rd.pro
3. make
И выдается следующее:
В чем проблема?
Код:
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
В чем проблема?
Re: Как компилить, как запускать и где код писать?
Ну типа нажми <Enter> посередине 1ой строки.В чем проблема?
ICQ 547097
Re: Как компилить, как запускать и где код писать?
Точно. Не знаю почему, но я этого даже и не заметил - так бы и сам исправил.
Re: Как компилить, как запускать и где код писать?
Твоя проблема в том. что компилятор ясно указал, где ошибка, а ты совсем не читаешь, что он тебе пишет.
ICQ 547097
Re: Как компилить, как запускать и где код писать?
А у меня вот такая проблема...
Решил я попробовать самый первый пример из книги скомпилить:
после этого выполняю:
компилятор выдает:
В чем загвоздка не пойму!!!
Система: FreeBSD 6.2-RELEASE.
Переменные окружения:
QMAKESPEC=/usr/local/share/qt/mkspecs/freebsd-g++
QTDIR=/usr/local
Вот переменные из сгенерированного Makefile:
Файлы qapplication.h и qlabel.h компилер находит (я пробовал ради эксперимента запускать $c++ -o hello hello.cpp, тогда компилер явно указывает на отсутствие заголовков, а с использованием опции -I/usr/local/include он выдает тоже самое, что и make)
Просмотрел qapplication.h и qlabel.h - там Qapplication и Qlabel объявлены....
Поискал в нете - там описываются либо другие проблемы, либо все у всех получается...
Подскажите, плз, что я упустил? Моя логика зашла в тупик...
P.S. Все Qt-приложения из портов компилятся и запускаются без проблем! Ананас тоже собрался!
Решил я попробовать самый первый пример из книги скомпилить:
Код: Выделить всё
#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: Как компилить, как запускать и где код писать?
А они, случаем, не QApplication и не QLabel (большие буквы)?
Re: Как компилить, как запускать и где код писать?
в /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: Как компилить, как запускать и где код писать?
Я не про хедеры, а про то, что у Вас в программе написано.
Попробуйте заменить
Qapplication app(argc, argv);
Qlabel * label = new Qlabel("Hello, Qt!", 0);
на
QApplication app(argc, argv);
QLabel * label = new QLabel("Hello, Qt!", 0);
Попробуйте заменить
Qapplication app(argc, argv);
Qlabel * label = new Qlabel("Hello, Qt!", 0);
на
QApplication app(argc, argv);
QLabel * label = new QLabel("Hello, Qt!", 0);
Re: Как компилить, как запускать и где код писать?
Спасибо огромное, Uncle_Theodore
И куда мои глаза смотрели? Ведь просматривал и хедеры и assistant смотрел...
Все получилось!
И куда мои глаза смотрели? Ведь просматривал и хедеры и assistant смотрел...
Все получилось!
Re: Как компилить, как запускать и где код писать?
помогите разобраться как работать правильно со слотами и сигналами, ведь кроме стандартных слов можно писать и свои? вот допустим есть примитивный код:
при сборке оно ругается:
то есть на обьявление слота
В чем проблемма?
Код: Выделить всё
#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
то есть на обьявление слота
В чем проблемма?
Re: Как компилить, как запускать и где код писать?
Я сам только недавно начал изучать C++ и Qt...
Может я и не прав, но я так понял, что слоты являются членами классов. То есть сначала нужно объявить свой класс в качестве наследника того класса, в котором есть слоты, а в нем уже создавать слот. А в Вашем примере в восьмой строке слот объявляется вне класса.
P.S. Если я не прав, то буду благодарен за развернутый ответ.
Re: Как компилить, как запускать и где код писать?
я тоже начинающий Qt-шник, советую делать в таком стиле:
edittolabel.h
edittolabel.cpp
main.cpp
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();
}
Re: Как компилить, как запускать и где код писать?
и ещё совет - есть хорошая книжка "Qt4: программирование GUI на c++", советую начать с неё, помойму есть в нете в электронном виде
Re: Как компилить, как запускать и где код писать?
Nark, Olegator спасибо за советы . тот код что вы привели в пример я в принципе понял, кроме одного:
а именно что делает this? что это за слово и как оно работает я теоретически представляю, но до сих пор у меня с ним не получается, еще с изучения java . оно, что в данном случае ссылается на lineEdit? вообщем, если можно, растолкуйте
а на счет книги, то она у меня есть и я по ней и изучаю Qt4(ну плюс assistant)
connect(textToLabelButton,SIGNAL(clicked()),this,SLOT(setTextToLabel()));
а именно что делает this? что это за слово и как оно работает я теоретически представляю, но до сих пор у меня с ним не получается, еще с изучения java . оно, что в данном случае ссылается на lineEdit? вообщем, если можно, растолкуйте
а на счет книги, то она у меня есть и я по ней и изучаю Qt4(ну плюс assistant)
Re: Как компилить, как запускать и где код писать?
chups писал(а): ↑13.12.2007 15:11Nark, Olegator спасибо за советы . тот код что вы привели в пример я в принципе понял, кроме одного:
connect(textToLabelButton,SIGNAL(clicked()),this,SLOT(setTextToLabel()));
а именно что делает this? что это за слово и как оно работает я теоретически представляю, но до сих пор у меня с ним не получается, еще с изучения java . оно, что в данном случае ссылается на lineEdit? вообщем, если можно, растолкуйте
а на счет книги, то она у меня есть и я по ней и изучаю Qt4(ну плюс assistant)
this, это указатель на текущий объект, в данном случае будет возвращён указатель на объект класса EditToLabel. смысл примерно такой. и почитайте книжку по C++. на lineedit ничего не ссылается, мы в классе EditToLabel создали свой слот setTextToLabel(), который выполняет следующие textLabel->setText(lineEdit->text()) и связывается с сигналом clicked() компонента textToLabelButton
Re: Как компилить, как запускать и где код писать?
что у меня не получается с этими слотами-сигналами, вот код:
main.cpp
tree.h
tree.cpp
ну и за одно созданый в Qt Desinger ui_finder.h
то что я накидал в дизайнере собирается спокойно, только я добавляю обьявление класса Tree и пытаюсь его подключить к кнопке, то вылезают ошибки(по щелчку на кнопку должно выскакивать окошко с построеным деревом ФС). как это все правильно реализуется?
P.S. извиняюсь за детские, может быть, вопросы
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. извиняюсь за детские, может быть, вопросы
Re: Как компилить, как запускать и где код писать?
ну вы даёте! вроде и книжка есть, а такое ошущение что вы её не открывали . и так по порядку, вот код который генерирует редактор форм:
ui_finder.h
чтобы удобно получать доступ к объектам и свойствам класса finderClass, нужно сделать множественное наследование:
finder.h
теперь мы можем напрямую обращаться к объектам класса, сгенерированного в графическом редакторе.
обратите внимание что мы объявляем два класса class QDirModel и class QTreeView, так как в #include <QWidget> описаний их не содержиться, описание содержиться в #include <QtGui>, но он очень большой и поэтому включать его в заголовочный файл не желательно.
finder.cpp
обратите внимание что мы здесь проверяем существование указателя на объект класса QTreeView, если его нет то мы его создаём, а у вас он в любом случае создаётся даже если уже и существует
main.cpp
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();
}
Re: Как компилить, как запускать и где код писать?
Olegator, большое спасибо, извиняюсь за несколько поздный ответ, во многом ваш пост мне помог(книгу стал чаще открывать), но появилась одна проблема, пока не могу понять как с ней справиться.
Выдает ошибку:
Здесь я получаю, строку QString path, я хочу ее установить в lineEdit_path(экземпляр типа QLineEdit), но вот в чем проблема: метод insert() требует в качестве параметров const QString. как обычный QString "преобразовать" в const QString? я что-то не пойму. обьясните пожалуста
Код: Выделить всё
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? я что-то не пойму. обьясните пожалуста
Re: Как компилить, как запускать и где код писать?
сам спросил - сам и решил проблему, просто нужно было сделать вот так:
и обьявить не указатель на строку(как я сделал), а просто:
может это не самое изящное решение, но у меня так работает
Код: Выделить всё
path = model->filePath(currentIndex);
и обьявить не указатель на строку(как я сделал), а просто:
Код: Выделить всё
QString path;
может это не самое изящное решение, но у меня так работает
Re: Как компилить, как запускать и где код писать?
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++"(где-то есть в электронном виде), а то вы с таким потходом ничего хорошего не напишите
Re: Как компилить, как запускать и где код писать?
я впринципе С++ практически не знаю, а более-менее знаю java. знаю что для успешного освоения Qt нужен С++, но пока не имею времени на изучение - сесия, но в следуещем году обещаю исправится
Re: Как компилить, как запускать и где код писать?
chups, попробуй Python и PyQt4. Связка реально рулит, причем Python на базовом уровне можно выучить за пару вечеров.
Re: Как компилить, как запускать и где код писать?
спасибо за совет, но как-то попробовал ради интереса почитать книгу о Python, чесно говоря не очень понравилось, но это было давно, а в Qt4 я уже вьехал, курсовик по програмированию сдал на 100 балов, не без помощи этого раздела