Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

Создание окна и виджетов в классе

30.05.2012, 23:54. Просмотров 1003. Ответов 5
Метки нет (Все метки)

Loauding.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef LOAUDING_H
#define LOAUDING_H
#include <string>
#include <QtGui>
#include <Obj.h>
class cLoauding : public QObject {
    Q_OBJECT
public:
    QString OriginalPicturePath;
    QPixmap OriginalPicture;
    QLabel OriginalPict;
    QGridLayout LayoutShavedPicter;
    QGridLayout LayoutMain;
    cObj Obj[8];
    int FWidth,FHeight;
    QWidget Form1;
 
    void Start();
 
public slots:
    void SetPicture();
    void ShaveSlot();
signals:
    void ShaveSignal();
};
#endif // LOAUDING_H
Loauding.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <Loauding.h>
#include <QDialog>
#include <math.h>
 
//вырезано
void cLoauding::Start(){
 
 
  //  QGridLayout = new QGridLayout;
    QBoxLayout* LayoutPicter = new QBoxLayout(QBoxLayout::LeftToRight);
    QGridLayout* LayoutButtons = new QGridLayout;
    QPushButton* ButLoaud = new QPushButton(QObject::tr(" Загрузить картинку "));
    QPushButton* ButRefresh = new QPushButton(QObject::tr("Обновить"));
    QPushButton* ButMatchTrue = new QPushButton(QObject::tr("Собрать"));
    cLoauding Loading;
 
    //---------------------------------------------------------------------------------------------------------------
 
    ButRefresh->setEnabled(false);
    ButMatchTrue->setEnabled(false);
 
    //---------------------------------------------------------------------------------------------------------------
 
    LayoutButtons->addWidget(ButLoaud,0,0,Qt::AlignTop);
    LayoutButtons->addWidget(ButRefresh,0,1,Qt::AlignTop);
    LayoutButtons->addWidget(ButMatchTrue,0,2,Qt::AlignTop);
 
 
 
   // LayoutMain->addLayout(LayoutButtons,0,0,1,2);
    Loading.LayoutMain.addLayout(LayoutButtons,0,0,1,2);
   // LayoutMain->addWidget(&cLoauding::OriginalPict,1,0,Qt::AlignLeft);
   // LayoutMain->addLayout(cLoauding::LayoutShavedPicter,1,1,Qt::AlignRight);
 
    Loading.LayoutMain.addWidget(&Loading.OriginalPict,1,0,Qt::AlignLeft);
    Loading.LayoutMain.addLayout(&Loading.LayoutShavedPicter,1,1,Qt::AlignRight);
 
 
    //---------------------------------------------------------------------------------------------------------------
 
    QObject::connect(ButLoaud,SIGNAL(clicked()),this,SLOT(SetPicture()));
    QObject::connect(this,SIGNAL(ShaveSignal()),this,SLOT(ShaveSlot()));
 
   /* cLoauding::Form1.setWindowTitle("Match Picture");
    cLoauding::Form1.setLayout(Loading.LayoutMain);
    cLoauding::Form1.show();*/
 
    Loading.Form1.setWindowTitle("Match Picture");
    Loading.Form1.setLayout(&Loading.LayoutMain);
    Loading.Form1.show();
 
}
Суть проблемы:
Все отлично компилируется, но после запуска окна не появляется (в main`е сразу же вызывается функция Start() (она выполняется, какая-то лажа с окном). Ежели делать как в закомментированном варианте
C++ (Qt)
1
2
3
 /* cLoauding::Form1.setWindowTitle("Match Picture");
    cLoauding::Form1.setLayout(Loading.LayoutMain);
    cLoauding::Form1.show();*/
то окно появляется, но тогда не выходит добавить в окно разметку (LayoutMain) ,т.к. на сколько я понимаю Loading.Form1 и cLoauding::Form1 это два разных объекта (закомментированный вариант где я это пытаюсь делать, дает ошибку при компиляции)
правильно ли я это понимаю?
почему при одном обращении окно появляется, при другом нет?

как исправит код?


Чистый, если вы зайдете в данную тему и решите ответить, то прошу воздержаться от советов или помечайте их "не по теме".

Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2012, 23:54
Ответы с готовыми решениями:

Создание формы и виджетов
Решил попробовать сделать, что-нибудь без Qt Designer, напрямую через код....

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

Динамическое создание виджетов на форме
Здраствуйте, пробую создание множества виджетов на форме, по кнопке те по...

Динамическое создание и добавление виджетов в QStackableWidget
сабж. Попробовал сделать так: QStackedWidget *tabsWidget = new...

Подгон размера виджетов в зависимости от размера окна
Добрый день. Возникла необходимость изменять размеры виджетов при изменении...

5
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.05.2012, 00:26 2
main файл в студию!

Добавлено через 1 минуту
+ меня смущает, что cLoauding - наследник от QObject, а не QMainWidget или хотя бы QWidget, что подразумевалось под данным кодом?

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

Добавлено через 1 минуту
cLoauding::Form1 - и не должно работать, т.к. Form1 - это не статическая переменная и таким образом к ней обращаться нельзя!

Добавлено через 2 минуты
пробуйте удалить нафик cLoauding Loading; и вместо переменной Loading везде писать Form1

ну и естественно Form1.Form1 - писать нельзя будет, т.е. просто пишите Form1.blaBlaBla(); теоретически да же сработать может
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
31.05.2012, 11:35  [ТС] 3
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QTextCodec>
#include <QtGui>
#include <Loauding.h>
 
int main(int argc, char *argv[])
{
    QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
    QApplication a(argc, argv);
    cLoauding Loading;
 
    Loading.Start();
 
    return a.exec();
}
Цитата Сообщение от l_a_m Посмотреть сообщение
+ меня смущает, что cLoauding - наследник от QObject, а не QMainWidget или хотя бы QWidget, что подразумевалось под данным кодом?
я в с++ новенький, поэтому сам не до конца понимаю что подразумевалось под этим кодом))
если бы мой класс был наследником от QMainWidget то я мог бы использовать уже готовую ui и не создавать свою?

конструктор описанного выше класса покажите ещё,
это что и где находится?)

для чего в функции старт создавать в стеке экземпляр этого же класса (который естественно удалиться, после выхода из этой функции (старт)
да я просто не знаю уже как обращаться к разметке, чтобы оно компилировалось)
в чем вообще разница между таким обращением
C++ (Qt)
1
 cLoauding::OriginalPicturePath="";
и таким
C++ (Qt)
1
OriginalPicturePath="";
например в функции cLoauding::SetPicture(была вырезана из Loauding.cpp) все работает, как задумано)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void cLoauding::SetPicture(){
    cLoauding::OriginalPicturePath="";
    cLoauding::OriginalPicturePath=QFileDialog::getOpenFileName(0,QObject::tr("Выберите картинку"),"","*.jpg *.bmp");
    if (cLoauding::OriginalPicturePath!=""){
      cLoauding::OriginalPicture.load(cLoauding::OriginalPicturePath);
      cLoauding::OriginalPict.setPixmap(cLoauding::OriginalPicture.scaled(cLoauding::Form1.width()/2,cLoauding::Form1.height()-40,Qt::KeepAspectRatio,Qt::SmoothTransformation));
 
      int SH,SW;
 
      SH=cLoauding::OriginalPict.height()/3;
      SW=cLoauding::OriginalPict.width()/3;
 
      Obj[0].Img=cLoauding::OriginalPicture.copy(0,0,SW,SH);
      Obj[0].Label.setPixmap(Obj[0].Img.scaled(cLoauding::Form1.width()/6,cLoauding::Form1.height(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
      Obj[0].Label.show();
    }
    else{
        //сообщение
    }
 
};

Вы видимо хотите сделать свою ui-ку?
да,хочу)



изменил Loauding.cpp (функцию Start())
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void cLoauding::Start(){
 
 
    QBoxLayout* LayoutPicter = new QBoxLayout(QBoxLayout::LeftToRight);
    QGridLayout* LayoutButtons = new QGridLayout;
    QPushButton* ButLoaud = new QPushButton(QObject::tr(" Загрузить картинку "));
    QPushButton* ButRefresh = new QPushButton(QObject::tr("Обновить"));
    QPushButton* ButMatchTrue = new QPushButton(QObject::tr("Собрать"));
 
    //---------------------------------------------------------------------------------------------------------------
 
    ButRefresh->setEnabled(false);
    ButMatchTrue->setEnabled(false);
 
    //---------------------------------------------------------------------------------------------------------------
 
    LayoutButtons->addWidget(ButLoaud,0,0,Qt::AlignTop);
    LayoutButtons->addWidget(ButRefresh,0,1,Qt::AlignTop);
    LayoutButtons->addWidget(ButMatchTrue,0,2,Qt::AlignTop);
 
 
    LayoutMain.addWidget(&OriginalPict,1,0,Qt::AlignLeft);
    LayoutMain.addLayout(&LayoutShavedPicter,1,1,Qt::AlignRight);
 
 
    //---------------------------------------------------------------------------------------------------------------
 
    QObject::connect(ButLoaud,SIGNAL(clicked()),this,SLOT(SetPicture()));
    QObject::connect(this,SIGNAL(ShaveSignal()),this,SLOT(ShaveSlot()));
 
 
    Form1.setWindowTitle("Match Picture");
    Form1.setLayout(&LayoutMain);
    Form1.show();
 
 
}

компилируется..но проблема та же

Запускается D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe...
Программа неожиданно завершилась.
D:\Soft\OtSDK\Projects\Picture\Match_Picture-build-desktop-Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK_________\debug\Match_Picture.exe завершился с кодом -1073741819
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.05.2012, 11:50 4
бред какой-то... что конкретно вы хотите сделать?
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
31.05.2012, 19:45  [ТС] 5
создать окно,на него положить основную разметку (LayoutMain). в нее вставляем еще разметки,так,как указано на рисунке
http://www.cyberforum.ru/attachment....p;d=1337606511
3(верхний) нормально вставляется.
1(туда гружу картинку, функций SetPicture)
но не получается засунуть саму картинку именно в эту часть разметки (ошибка компиляции или в данном случае вообще непонятно что). а вторая строчка добавляет еще одну вложенную разметку в часть 3(справа)
C++ (Qt)
1
2
LayoutMain.addWidget(&OriginalPict,1,0,Qt::AlignLeft);
    LayoutMain.addLayout(&LayoutShavedPicter,1,1,Qt::AlignRight);
ответьте, пожалуйста, в чем разница между обращениями (мой предыдущий пост)
потому что гвоздь именно в этом. что-то с окном не так,не верно обращаюсь к нему

Добавлено через 31 минуту
не знаю что произошло,но окно создается
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void cLoauding::Start(){
 
    QBoxLayout* LayoutPicter = new QBoxLayout(QBoxLayout::LeftToRight);
    QGridLayout* LayoutButtons = new QGridLayout;
    QPushButton* ButLoaud = new QPushButton(QObject::tr(" Загрузить картинку "));
    QPushButton* ButRefresh = new QPushButton(QObject::tr("Обновить"));
    QPushButton* ButMatchTrue = new QPushButton(QObject::tr("Собрать"));
 
    //---------------------------------------------------------------------------------------------------------------
 
    ButRefresh->setEnabled(false);
    ButMatchTrue->setEnabled(false);
 
    //---------------------------------------------------------------------------------------------------------------
 
    LayoutButtons->addWidget(ButLoaud,0,0,Qt::AlignTop);
    LayoutButtons->addWidget(ButRefresh,0,1,Qt::AlignTop);
    LayoutButtons->addWidget(ButMatchTrue,0,2,Qt::AlignTop);
 
    LayoutMain.addWidget(&OriginalPict,1,0,Qt::AlignLeft);
    LayoutMain.addLayout(&LayoutShavedPicter,1,1,Qt::AlignRight);
 
 
    //---------------------------------------------------------------------------------------------------------------
 
    QObject::connect(ButLoaud,SIGNAL(clicked()),this,SLOT(SetPicture()));
    QObject::connect(this,SIGNAL(ShaveSignal()),this,SLOT(ShaveSlot()));
 
    Form1.setWindowTitle("Match Picture");
    Form1.setLayout(&LayoutMain);
    Form1.show();
}
НО
окно создается пустым,в нем только заголовок поменялся на Match Picture. кнопочек и соответственно раскладки на нем нету.
как так?

вопрос про обращения все еще актуален
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.06.2012, 09:41 6
Цитата Сообщение от spydark91 Посмотреть сообщение
ответьте, пожалуйста, в чем разница между обращениями (мой предыдущий пост)
потому что гвоздь именно в этом. что-то с окном не так,не верно обращаюсь к нему
не обижайтесь конечно, но в Вашем предыдущем посте сплошная херь написана....

C++ (Qt)
1
2
3
4
5
6
class A{
  public: static int someVar;
  public: static void someFunc();
}
A::someVar = 5;
A::someFunc();
Обращение к статической переменной и к статической функции...

C++ (Qt)
1
2
3
namespace SomeNamespace{
  const QString test;
};
C++ (Qt)
1
SomeNamespace::test = "test";
обращение к переменной скрытой в namespace-е

C++ (Qt)
1
::someVar
- обращение к глобальной переменной, которая находится вне каких либо namespace-ов.

C++ (Qt)
1
2
3
4
5
6
7
8
class A{
  public: virtual void someF();
}
class B: public A{
  public: void someF(){
     A::someF(); // явное указание компилятору, что требуется использовать функцию someF()  класса A; 
  }
}
в общем как-то так, больше использования оператора :: я не припомню...
1
01.06.2012, 09:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2012, 09:41

Создание своего окна
Здравствуйте!Год назад я начал интересоваться Qt. Взявшись за интересную тему...

Создание диалогового окна
Помогите пожалуйста описать класс диалогового окна... сейчас пробую так: ...

Создание диалогового окна
Здравствуйте. Мне необходимо создать диалоговое окно. В программе есть один...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru