Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > [qt4] работа с указателем ui


Автор: gordmiand 15.2.2010, 15:45
  В хидере переношу Ui::MainWindow *ui; из private в public, но все равно надо указывать 
ui->lineEdit->…  почему?

Автор: Любитель 15.2.2010, 18:09
Потому что дело не в прайват/паблик. Просто lineEdit vожно было писать только для глобальных переменных, полей класса (в том числе наследованных, если это паблик/протектед), параметров функции и локальных переменных функции. И всё.


Автор: gordmiand 15.2.2010, 20:41
это не только с lineEdit такая петрушка получается... и для label тоже... получается для все компонентов ui-> указывать надо?

Добавлено через 10 минут и 53 секунды
это не только с lineEdit такая петрушка получается... и для label тоже... получается для все компонентов надо железно указывать ui->  ?

Автор: bsa 15.2.2010, 21:02
gordmiand, сделай наследование от Ui::MainWindow - после этого не нужно будет писать ui->...
Код
class MyWidget : public QMainWindow, private Ui::MainWindow
{
...
};

Автор: gordmiand 15.2.2010, 21:57
mainwindow.h
Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;   // [U]error: forward declaration of 'struct Ui::MainWindow'[/U]
}

class MainWindow : public QMainWindow, private Ui::MainWindow
{ [U]// error: invalid use of incomplete type 'struct Ui::MainWindow'[/U]
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //Ui::MainWindow *ui;


protected:
    void changeEvent(QEvent *e);

private:
      Ui::MainWindow *ui;

private slots:
    void on_checkBox_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H



main.cpp
Код

#include <QtGui/QApplication>
#include "mainwindow.h"                 //? In file included from main.cpp:2: c:\proga\main.cpp

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

такие вот ошибки... что не так? совсем я заблудился в этих классах


Автор: gordmiand 15.2.2010, 23:47
mainwindow.h
Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;   // [U]error: forward declaration of 'struct Ui::MainWindow'[/U]
}

class MainWindow : public QMainWindow, private Ui::MainWindow
{ [U]// error: invalid use of incomplete type 'struct Ui::MainWindow'[/U]
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //Ui::MainWindow *ui;


protected:
    void changeEvent(QEvent *e);

private:
      Ui::MainWindow *ui;

private slots:
    void on_checkBox_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H



main.cpp
Код

#include <QtGui/QApplication>
#include "mainwindow.h"                 //? In file included from main.cpp:2: c:\proga\main.cpp

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

такие вот ошибки... что не так? совсем я заблудился в этих классах

и вообще - при создании проекта какой базовый класс надо выбирать: Qmainwindow, QWidget, Qdialog...
в чем их отличие?

Автор: gordmiand 16.2.2010, 20:46
mainwindow.h
Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;   // [U]error: forward declaration of 'struct Ui::MainWindow'[/U]
}

class MainWindow : public QMainWindow, private Ui::MainWindow
{ [U]// error: invalid use of incomplete type 'struct Ui::MainWindow'[/U]
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //Ui::MainWindow *ui;


protected:
    void changeEvent(QEvent *e);

private:
      Ui::MainWindow *ui;

private slots:
    void on_checkBox_clicked();
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H



main.cpp
Код

#include <QtGui/QApplication>
#include "mainwindow.h"                 //? In file included from main.cpp:2: c:\proga\main.cpp

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

такие вот ошибки... что не так? совсем я заблудился в этих классах
и вообще - при создании проекта какой базовый класс надо выбирать: Qmainwindow, QWidget, Qdialog...
в чем их отличие?

Автор: kuvshinka 16.2.2010, 23:31
bsa: у меня что-то тоже не получается: что за класс MyWidget? базовый (который указываестя при создании приложения)? у меня базовый -  MainWindow.... а какой надо указывать?
пробую так:
Код

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow,  [U]private Ui::MainWindow[/U]
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);

//private:
    //Ui::MainWindow *ui;

private slots:
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H
 
ошибки  invalid use of incomplete type 'struct Ui::MainWindow',   forward declaration of 'struct Ui::MainWindow'

Автор: zayacnk 16.2.2010, 23:42
Попробуй по пунктам:

1. Создаешь форму например с кнопкой pbSet и строкой lText и сохраняешь форму в MainWindow.ui
    ObjectName у формы MainWindow

2. Создаешь хедер mainwindow.h следующго содержания:

Код

#include <QMainWindow>
#include "ui_mainwindow.h"

class MainWindow  :  public QMainWindow, public Ui::MainWindow
{
  Q_OBJECT

  public:
    MainWindow(QWidget *parent = 0);

  private slots: 
    void on_pbSet_clicked();
}



3. Исходник mainwindow.cpp следующего содержания
Код

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
  setupUi(this);
}

void MainWindow::on_pbSet_clicked()
{
  lText->setText(tr("hello"));
}



За опечатки сорри. Собственно ui указывать перед именами объектов формы указывать не надо

Автор: Любитель 17.2.2010, 00:19
Цитата(kuvshinka @  16.2.2010,  23:31 Найти цитируемый пост)
пробую так:

Только форвард-декларейшен при наследовании не применим. Компилятор должен знать сразу, сколько памяти классу нужно и т. д. Форвард декларейшен примением только для указателя/ссылки, но не для базового класса.

Автор: bsa 17.2.2010, 00:27
kuvshinka, в твоем варианте используется идиома PIMPL. Т.е. Ui подключается в cpp файле. В этом случае без ui-> не обойтись. Я имел в виду то, что привел в пример zayacnk

Автор: kuvshinka 17.2.2010, 00:31
а хедер и исходник создавать полностью руками или можно их скомпилить при  разработке формы в qt designer?

Автор: bsa 17.2.2010, 14:07
kuvshinka, если не ошибаюсь, дизайнер работает только с ui файлами. Поэтому h/cpp нужно создавать вручную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)