Архивировано

Эта тема находится в архиве и закрыта для публикации сообщений.

SmirnoFFx

Кроссплатформенное программирование на Qt4

Рекомендованные сообщения

Господа! Подскажите, пожалуйста, как реализовать задуманную мною вещичку :-)

 

Я интегрировал Qt в MS Visual Studio 2008. В Qt Designer создал следующую форму:

 

post-352379-1264179575_thumb.jpg

 

Цель1: сделать так, чтобы по нажатии на кнопку pushButton (нижняя правая) (ObjectName pushButton_3) поле, в котором написано "апапавпвапвап" (ObjectName le) очистилось.

 

Соответственно написал код:

 

#include "designer.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
designer w;
QObject::connect(
	&pushButton_3,
	SIGNAL(clicked()),
	≤,
	SLOT(clear()));

w.show();
return a.exec();
}

 

Но не компилируется. Пишет, что:

1>.\main.cpp(9) : error C2065: pushButton_3: необъявленный идентификатор
1>.\main.cpp(11) : error C2065: le: необъявленный идентификатор

 

Вопрос: как объявить те элементы формы в коде, с которыми я хочу работать?

 

Цель2: сделать так, чтобы в поле, в котором написано "апапавпвапвап" (ObjectName le) по нажатии там на клавишу Enter на клавиатуре произошло что либо, например поменялся CurrentIndex у ComboBox'a (ObjectName chb).

Чтобы узнать тип события, имеется метод QEvent::type(). Но как это все реализовать программно?

 

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

 

Спасибо.

1 Где строка привязки UI файла, где его загрузка?

2 с чего вы взяли что метод клеар очистит надпись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 Где строка привязки UI файла, где его загрузка?

 

Подключил:

 

#include "designer.ui"

 

Посыпались ошибки:

 

1>------ Построение начато: проект: designer, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(1) : error C2059: синтаксическая ошибка: <
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(3) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(3) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(3) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(3) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(4) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(4) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(17) : error C2332: enum: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(17) : error C2332: enum: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(19) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(19) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(20) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(20) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(63) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(63) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(76) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(76) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(86) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(86) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(98) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(98) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(114) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(114) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(127) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(127) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(141) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(141) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(154) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(154) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(167) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(167) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(180) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(180) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(190) : error C2332: enum: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(190) : error C2332: enum: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(192) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(192) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(197) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(197) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(204) : error C2332: class: отсутствует имя тега
1>d:\my_documents\visual studio 2008\projects\designer\designer\designer.ui(204) : error C2011: <unnamed-tag>: переопределение типа "enum"
1>		d:\qt\2010.01\qt\include\qtcore\../../src/corelib/global/qglobal.h(2017): см. объявление '<unnamed-tag>'
1>.\main.cpp(6) : error C2143: синтаксическая ошибка: отсутствие ";" перед "{"
1>.\main.cpp(6) : error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа)
1>Журнал построения был сохранен в "file://d:\my_documents\Visual Studio 2008\Projects\designer\designer\Debug\BuildLog.htm"
1>designer - ошибок 43, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

 

Прилагаю архив с проектом:

 

designer.zip

 

Вопрос: как загрузить ui файл? Как его использовать?

 

2 с чего вы взяли что метод клеар очистит надпись?

 

Как можно посмотреть на скриншоте:

post-352379-1264335471_thumb.jpg

Видно, что в слоте для pushButton_2 написано clear(). И, действительно, по нажатии на кнопку происходит очистка поля от текста :-) Как ни странно....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И так я готов отвечать!

1. Не умеете пользоваться QDesigner -собирайте в ручную, это только кажется что с помощью дезигнера все проще - нефига подобного.

2. Что там на монтировала студия я даже разбираться не хочу.

3. У Шелле прекрасно описано, как использовать дезигнер там доступно описано, что форма из дезигнера должна быть подключена и потом еще загружена. Я по этому поводу советовать ничего не буду, я не умею пользоваться дезигнером, мне не надо я собираю исключительно в ручную - получается куда проще и понятнее.

Так теперь по поводу как же все это сделать в ручную. Проект создан на базе QWidget, и мы имеем три файла main.cpp Widget.h и Widget.cpp

Нам понадобятся библиотеки

#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QDoubleSpinBox>
#include <QDateTimeEdit>
#include <QRadioButton>
#include <QGroupBox>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
//------------------------------------
#include <QTextCodec> //для нормального отображения русского языка
#include <QAction>
#include <QKeySequence>

 

теперь как выглядит файл main

#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widget w;
w.show();

return app.exec();
}

 

объявем все переменные функции и прочие в файле Widget.h

#define WIDGET_H

#include <QtGui/QWidget>
//сие нам понадобится для формирования картинки
#include <QLabel>
#include <QLineEdit>
#include <QComboBox>
#include <QDoubleSpinBox>
#include <QDateTimeEdit>
#include <QRadioButton>
#include <QGroupBox>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
//------------------------------------
#include <QTextCodec> //для нормального отображения русского языка
//для создания горячих клавишь
#include <QAction>
#include <QKeySequence>

class Widget : public QWidget
{
Q_OBJECT

public:
Widget(QWidget *parent = 0);
~Widget();
private:
// объявляем переменные
QLabel		  *lb;
QLineEdit	   *line;
QComboBox	   *combo;
QDoubleSpinBox  *doublespin;
QDateTimeEdit   *timeedit;
QRadioButton	*radio1;
QRadioButton	*radio2;
QRadioButton	*radio3;
QGroupBox	   *radiogroup;
QPushButton	 *button1;
QPushButton	 *button2;
QPushButton	 *button3;
QHBoxLayout	 *line1;
QHBoxLayout	 *line2;
QHBoxLayout	 *line3;
QHBoxLayout	 *radio_layout;
QHBoxLayout	 *button_layout;
QVBoxLayout	 *main_layout;
QAction		 *newAction;

//объявляем функции
void	language_support();
void	variable_init();
void	set_view();
void	set_variable();
void	connect_events();
private slots:
void	line_edit();

signals:
void	ctrln();





};

#endif // WIDGET_H

ну и файлик Widget.cpp

#include "widget.h"
extern QApplication a;

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
language_support();
variable_init();
set_view();
set_variable();
connect_events();

}

Widget::~Widget()
{

}
void	Widget::language_support()
{
// устанавливаем кодовую страницу данной машинны
QTextCodec::setCodecForTr(QTextCodec::codecForName("cp1251"));
}
void	Widget::variable_init()
{
// здесь создадим все объекты
lb=			 new	 QLabel;
line=		   new	 QLineEdit;
combo=		  new	 QComboBox;
doublespin=	 new	 QDoubleSpinBox;
timeedit=	   new	 QDateTimeEdit;
radio1=		 new	 QRadioButton;
radio2=		 new	 QRadioButton;
radio3=		 new	 QRadioButton;
radiogroup=	 new	 QGroupBox;
button1=		new	 QPushButton;
button2=		new	 QPushButton;
button3=		new	 QPushButton;
line1=		  new	 QHBoxLayout;
line2=		  new	 QHBoxLayout;
line3=		  new	 QHBoxLayout;
radio_layout=   new	 QHBoxLayout;
button_layout=  new	 QHBoxLayout;
main_layout=	new	 QVBoxLayout;
newAction=	  new	 QAction(this);


}
void	Widget::set_view()
{
//создаем изображение по строкам с верху вниз
//создаем первую строку
line1->addWidget(lb);
line1->addWidget(line);
line1->addStretch();
//вторая строка
line2->addStretch();
line2->addWidget(combo);
line2->addWidget(doublespin);
line2->addStretch();
//третья строка
line3->addStretch();
line3->addStretch();
line3->addWidget(timeedit);
line3->addStretch();
//формируем группу радиокнопок
radio_layout->addWidget(radio1,5,Qt::AlignCenter); //поставили растояние по центру и выравняли по центру
radio_layout->addWidget(radio2,5,Qt::AlignCenter);
radio_layout->addWidget(radio3,5,Qt::AlignCenter);
//запихиваем все это в groupbox
radiogroup->setLayout(radio_layout);
//формируем группу кнопок
button_layout->addWidget(button1,5,Qt::AlignCenter);
button_layout->addWidget(button2,5,Qt::AlignCenter);
button_layout->addWidget(button3,5,Qt::AlignCenter);
//формируем внешний вид
main_layout->addSpacing(3);
main_layout->addLayout(line1);
main_layout->addLayout(line2);
main_layout->addLayout(line3,5);
main_layout->addWidget(radiogroup,5,Qt::AlignHCenter);
main_layout->addSpacing(20);
main_layout->addLayout(button_layout);
//вставляем в виджет нашу картинку
setLayout(main_layout);

}
void	Widget::set_variable()
{
//здесь заведем стартовые значения подписи и прочие
lb->setText(tr("какой-то текст"));
line->setText(tr("какой-то текст"));
combo->addItem(tr("1"));
combo->addItem(tr("2"));
doublespin->setEnabled(false);
radio1->setText(tr("radio1"));
radio1->setChecked(true);
radio2->setText(tr("radio2"));
radio3->setText(tr("radio3"));
button1->setText(tr("Закрыть"));
button2->setText(tr("какойто текст"));
button3->setText(tr("какойто текст"));
  //привязываем комбинацию клавишь
newAction->setShortcut( QKeySequence(tr("Ctrl+n")));
addAction(newAction);




}
void	Widget::connect_events()
{
//соеденим третью кнопку с очисткой окошка
connect(button3,SIGNAL(clicked()),line,SLOT(clear()));
//соеденим закрыть с кнопкой один

connect(button1,SIGNAL(clicked()),this,SLOT(close()));
//обработка комбинаци ctrl+n
connect(newAction,SIGNAL(triggered()),this,SLOT(line_edit()));

}
void	Widget::line_edit()
{
line->setText(tr("нажата ctrl+n"));
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В Windows gdb действительно отвратителен, в Linux благо всё гораздо радужней. Но вообще как вариант - писать в VisualStudio, а потом просто компилить куда требуется.

VS - это платная версия QT!!!

да с чего бы это? :D

вы чёт путаете, батенька!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В Windows gdb действительно отвратителен, в Linux благо всё гораздо радужней. Но вообще как вариант - писать в VisualStudio, а потом просто компилить куда требуется.

VS - это платная версия QT!!!

да с чего бы это? :(

вы чёт путаете, батенька!

до 4 версии адаптер под vs был платным точно помню

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В Windows gdb действительно отвратителен, в Linux благо всё гораздо радужней. Но вообще как вариант - писать в VisualStudio, а потом просто компилить куда требуется.

VS - это платная версия QT!!!

да с чего бы это? :good:

вы чёт путаете, батенька!

до 4 версии адаптер под vs был платным точно помню

уже год как add-in имеется, он бесплатен абсолютно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В Windows gdb действительно отвратителен, в Linux благо всё гораздо радужней. Но вообще как вариант - писать в VisualStudio, а потом просто компилить куда требуется.

VS - это платная версия QT!!!

да с чего бы это? ;)

вы чёт путаете, батенька!

до 4 версии адаптер под vs был платным точно помню

уже год как add-in имеется, он бесплатен абсолютно.

Значит я отстал, но так как у меня все равно линуха везде - мне как то и не требуется

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

DeathStalker, спасибо за подробные примеры. Но по мне все писать в ручную это кошмар. Поэтому и хотел разобраться в дизайнере. Сам имею приличный опыт программирования на с++ в среде borland c++ builder. Удобная и простая IDE. Взял компонент, добавил на форму, разместил как надо и написал обработчик события/событий. Все логично и понятно. Но как я стал изучать Qt, у меня до сих пор в голове вертится вопрос: зачем разработчики так сделали? Написали библиотеки и ладно... С точки зрения юзабилити это шаг назад.

Вот так... Увы, но я серьезно подумаю над тем, стоит ли вообще изучать Qt...

 

А вот тут вот:

 //обработка комбинаци ctrl+n
connect(newAction,SIGNAL(triggered()),this,SLOT(line_edit()));

Как я понял получатель сигнала это все приложение (this) ?

 

Для того, чтобы сигнал получало только поле ввода QLineEdit, пишу так:

 //обработка комбинаци ctrl+n
connect(newAction,SIGNAL(triggered()),line,SLOT(line_edit()));

Не работает...

 

Что делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
DeathStalker, спасибо за подробные примеры. Но по мне все писать в ручную это кошмар. Поэтому и хотел разобраться в дизайнере. Сам имею приличный опыт программирования на с++ в среде borland c++ builder. Удобная и простая IDE. Взял компонент, добавил на форму, разместил как надо и написал обработчик события/событий. Все логично и понятно. Но как я стал изучать Qt, у меня до сих пор в голове вертится вопрос: зачем разработчики так сделали? Написали библиотеки и ладно... С точки зрения юзабилити это шаг назад.

Вот так... Увы, но я серьезно подумаю над тем, стоит ли вообще изучать Qt...

 

А вот тут вот:

 //обработка комбинаци ctrl+n
connect(newAction,SIGNAL(triggered()),this,SLOT(line_edit()));

Как я понял получатель сигнала это все приложение (this) ?

 

Для того, чтобы сигнал получало только поле ввода QLineEdit, пишу так:

 //обработка комбинаци ctrl+n
connect(newAction,SIGNAL(triggered()),line,SLOT(line_edit()));

Не работает...

 

Что делаю не так?

Когда я создовал объект класса QAction я указал к к чему он привязывается. В данном примере я привязал его именно ко всему приложению, а точнее к главному виджету.

Смотрите строку

newAction=	  new	 QAction(this);

Видимо из-за того что Вы до сих пор не разобрались в сигналах и слотах вы и пошли этим путем.

Теперь по поводу keyPressEvent(QKeyEvent *event)

Никто не мешает вам переопределить этот метод для каждого нужного вам объекта

на ходится он должен в секции protected.

 

По поводу юзабилити - видитили я тоже имею опыт как Delphi и Bilder C++, так и VS - поверьте юзабилити не идет назад а наоборот вперед. Мне нежну каждый раз дергать дезайнер что бы что то изменить. А система автокомпоновки, которую я использовал позволяет получить очень достойный результат. Кстати именно из-за того что те или иные методы компанентов должны быть переопределены сборка через дезайнер менее удобна, хотя и возможна. А в билдере у вас с этим возникнет куча проблем.

По поводу сигналов и слотов вы тоже зря - эта система сделана не случайно, в билдере к одному событию вы можете привязать только одну функцию(да внутри нее можно сделать вызов других, но всеже это запутывает). а с помощью сигналов можно задать целый каскад причем генерации не только результатов, но и самих событий.Например она жутко упрощает передачу данных вмногопоточных приложениях. На билдере и встудии если вы помните это делалось прямым доступом к памяти. А тут я просто посылаю данные из одной части программы в другую. А насчет изучать не изучать - это ваши личные проблемы, с того момента как мы начали общатся на эту тему прошло около пол года. И все это время Вы ищите способ как бы получить все приэтом раз пошевелив пальцем.У любого языка есть свои плюсы и минусы Qt не исключение. Эта надстройка порождение UNIX систем, а там гуевые приложения входить вмоду стали не так давно именно поэтому все это работает именно так. Для меня тоже был шок когда я впервые на QNX увидел что событие привязываетя уже после создания кода программы, а именно в дизайнере по кнопочкам распихивали хедоры и сорсеры. Поэтому думайте сами изучать вам сие или нет. Но сдается мне, уж коли вы перешли с Билдера - значит сие не спроста

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
...с того момента как мы начали общатся на эту тему прошло около пол года. И все это время Вы ищите способ как бы получить все приэтом раз пошевелив пальцем

 

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

 

Еще раз спасибо огромное Вам за помощь и ответы. Надеюсь я не утруждаю Вас своими вопросами. Извините, если я отнял у Вас время. Рассчитываю на дальнейшие подсказки и помощь с Вашей стороны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
...с того момента как мы начали общатся на эту тему прошло около пол года. И все это время Вы ищите способ как бы получить все приэтом раз пошевелив пальцем

 

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

 

Еще раз спасибо огромное Вам за помощь и ответы. Надеюсь я не утруждаю Вас своими вопросами. Извините, если я отнял у Вас время. Рассчитываю на дальнейшие подсказки и помощь с Вашей стороны.

Без проблем. Просто Вы как то не удосуживаетесь заглянуть в справку Qt - а это видно из ваших вопросов, вот я и удивляюсь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Приветствую!

 

Есть вопрос по использованию форм в проектах.

 

Итак, в прямом способе использования форм все ясно и очевидно:

 

#include "test2.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test2 w;
w.show();
return a.exec();
}

 

Но недостаток такого подхода очевиден - мы не в состоянии инициализировать данными и дополнять кодом используемый класс. Если в нашей форме есть виджеты, которые нуждаются в соединении со слотами, реализованными другими классами проекта, то способ, описанный выше - не для нас.

 

Поэтому хочу сделать это при помощи множественного наследования, а именно:

 

#include "test2.h"
#include <QtGui/QApplication>

class MyForm : public QWidget, public Ui::test2Class
{
 Q_OBJECT

public:
MyForm(QWidget* pwgt = 0) : QWidget(pwgt)
{
  setupUi(this);

  connect(pb2, SIGNAL(clicked()), SLOT(s()));  // pb2 - кнопка QPushButton

}
public slots:
void s()
{
	horizontalScrollBar->setValue(0);  // horizontalScrollBar - горизонтальный скроллбар на форме
	lcdNumber->display(0);				// lcdNumber - аналогично
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test2 w;
w.show();
return a.exec();
}

 

Но вопрос: почему не работает, когда нажимаю на кнопку pb2? Ведь есть и соединение connect и все остальное, необходимое для работы.

 

test2.h:

#ifndef TEST2_H
#define TEST2_H

#include <QtGui/QWidget>
#include "ui_test2.h"

class test2 : public QWidget
{
Q_OBJECT

public:
test2(QWidget *parent = 0, Qt::WFlags flags = 0);
~test2();

private:
Ui::test2Class ui;
};

#endif // TEST2_H

 

Спасибо за подсказки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Приветствую!

 

Есть вопрос по использованию форм в проектах.

 

Итак, в прямом способе использования форм все ясно и очевидно:

 

#include "test2.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test2 w;
w.show();
return a.exec();
}

 

Но недостаток такого подхода очевиден - мы не в состоянии инициализировать данными и дополнять кодом используемый класс. Если в нашей форме есть виджеты, которые нуждаются в соединении со слотами, реализованными другими классами проекта, то способ, описанный выше - не для нас.

 

Поэтому хочу сделать это при помощи множественного наследования, а именно:

 

#include "test2.h"
#include <QtGui/QApplication>

class MyForm : public QWidget, public Ui::test2Class
{
 Q_OBJECT

public:
MyForm(QWidget* pwgt = 0) : QWidget(pwgt)
{
  setupUi(this);

  connect(pb2, SIGNAL(clicked()), SLOT(s()));  // pb2 - кнопка QPushButton

}
public slots:
void s()
{
	horizontalScrollBar->setValue(0);  // horizontalScrollBar - горизонтальный скроллбар на форме
	lcdNumber->display(0);				// lcdNumber - аналогично
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
test2 w;
w.show();
return a.exec();
}

 

Но вопрос: почему не работает, когда нажимаю на кнопку pb2? Ведь есть и соединение connect и все остальное, необходимое для работы.

 

test2.h:

#ifndef TEST2_H
#define TEST2_H

#include <QtGui/QWidget>
#include "ui_test2.h"

class test2 : public QWidget
{
Q_OBJECT

public:
test2(QWidget *parent = 0, Qt::WFlags flags = 0);
~test2();

private:
Ui::test2Class ui;
};

#endif // TEST2_H

 

Спасибо за подсказки.

Что идет вывод консоли, там обычно пишет все ли нормально подсоеденилось.

Кстати зря, можем. Мы можем динамически подцеплять и отцеплять любые виджиты во время работы. Если использовать массивы ссылок на классы

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все разобрался. Спасибо.

 

У меня Qt интегрирован в MS Visual Studio 2008.

Хотим сделать так, чтобы по нажатии на кнопку элемент lcdNumber принимал значение 0 и ползунок horizontalSlider принимал крайнее левое положение.

 

Сделал так:

  1. Создаем проект "newtest"
  2. Файл формы newtest.ui редактируем в Qt Designer

    1. Добавляем 2 QPushButton (pb1 и pb2)
    2. Добавляем lcdNumber
    3. Добавляем horizontalSlider

[*]В дизайнере с помощью стандартного редактора сигналов/слотов делаем:

  1. Чтобы по нажатии на pb1 форма закрывалась (слот close())
  2. Чтобы по перемещению ползунка horizontalSlider, lcdNumber принимал значение value ползунка

[*]Модифицируем файл newtest.h и добавляем в класс newtest группу public slots:

public slots:
void ButtonCl(void);

[*]В newtest.cpp пишем функцию-слот:

void newtest::ButtonCl(void)
{
ui.lcdNumber->display(0);
ui.horizontalSlider->setValue(0);
}

[*]В newtest.cpp соединяем сигнал и слот:

connect(ui.pb2, SIGNAL(clicked()), SLOT(ButtonCl()));

[*]Запускаем и наслаждаемся.

 

В результате файл newtest.cpp имеет следующее содержание:

#include "newtest.h"

newtest::newtest(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);
connect(ui.pb2, SIGNAL(clicked()), SLOT(ButtonCl()));
}

newtest::~newtest()
{

}

void newtest::ButtonCl(void)
{
ui.lcdNumber->display(0);
ui.horizontalSlider->setValue(0);
}

 

Файл newtest.h:

#ifndef NEWTEST_H
#define NEWTEST_H

#include <QtGui/QWidget>
#include "ui_newtest.h"

class newtest : public QWidget
{
Q_OBJECT

public:
newtest(QWidget *parent = 0, Qt::WFlags flags = 0);
~newtest();

public slots:
void ButtonCl(void);

private:
Ui::newtestClass ui;
};

#endif // NEWTEST_H

 

Файл main.cpp не изменился:

#include "newtest.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
newtest w;
w.show();
return a.exec();
}#include "newtest.h"
#include <QtGui/QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
newtest w;
w.show();
return a.exec();
}

 

Форма в Qt дизайнере:

post-352379-1268668192_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вопрос, товарищи!

Поставил новый qt, собрал, построил Debug Libraries, прописал все пути в path, установил новый Qt Creator. Запустил, настроил.

Вроде все ничего, но почему, когда создаю проект и нажимаю "выполнить" в режиме отладки, у меня Qt пытается запустить exe-файл не из папки debug? А хочет запустить непосредственно из папки проекта и пишет, что "Не удалось запустить процесс!". Правильно же. В этой папке нет exe-файла! Как исправить?

Еще эти непонятные "build-desktop" сделали. Теневая сборка. Это еще что и зачем? Знает кто?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

прошу помогите парни мне нужно связать консольное выражение с qt4 на ubuntu,а т.е в терминале я делаю некоторые запросы и мне надо к ним интерфейс, дайте маленький пример связки QT и терминала если не затруднит

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

прошу помогите парни мне нужно связать консольное выражение с qt4 на ubuntu,а т.е в терминале я делаю некоторые запросы и мне надо к ним интерфейс, дайте маленький пример связки QT и терминала если не затруднит

Здесь ответ на ваш вопрос

http://www.qtforum.org/article/11809/qprocess-and-stdout.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах