Russian Qt Forum

Qt => Вопросы новичков => Тема начата: LynXzp от Январь 08, 2017, 19:54



Название: Вопрос по созданию нового окна
Отправлено: LynXzp от Январь 08, 2017, 19:54
Можно вопрос по созданию нового окна, скорее даже о стиле и bestpractice. Все работает, но кажется я это сделал с вывертом.

Работаю в Qt Creator, создаю новое окно с помощью мастера "новый файл" -> Qt -> Класс формы Qt Designer ->создается три файла .cpp .h .ui
Окно (логов) будет открываться из меню главного окна (класса и cpp файла), а данные туда будут передаваться из другого cpp. В .h файлах этих двух .cpp пишу #include "logdialog.h".

В logdialog.h:
Код:
extern LogDialog *logDialog;
В logdialog.cpp:
Код:
LogDialog logDialog = NULL;
При первом вызове окна:
Код:
if(logDialog==NULL) logDialog = new LogDialog;

Все работает, но... с главным окном-то нет такого, только:
int main(int argc, char *argv[])
Код:
{	QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec(); }

Но так же сделать нельзя... В общем все конечно работает, проблем нет, но мне ужасно не нравится когда все в разном стиле написано. И я не только новичок в Qt, но и в C++, могу чего-то не знать. Программирование Qt/C++ это побочная необходимость на основной работе.


Название: Вопрос по созданию нового окна
Отправлено: Bepec от Январь 09, 2017, 03:42
Можно сделать так же. Просто есть несколько условностей, вроде того, что main.h не существует.
Конкретнее сформулируйте задачу, а уж мы вам поясним.


Название: Re: Вопрос по созданию нового окна
Отправлено: LynXzp от Март 13, 2017, 01:33
Упс, заметил что эта тема прикреплена, все еще не полностью разобрался с этим вопросом, хотя кое-как уже несколько программ сделал. Иногда работает, иногда нет. Но пока не могу сформулировать правильно и задать все вопросы, пока не знаю многих нюансов.

Открепите наверное тему, вопрос остается открытым, но пока не известно в каком направлении его решать.


Название: Re: Вопрос по созданию нового окна
Отправлено: lit-uriy от Март 13, 2017, 06:16
>>extern LogDialog *logDialog;
Это явно Дельфи-стиль

Объект надо создавать там где он нужен.
т.е. в слоте главного окна, обрабатывающего действие (QAction), создавай диалог на стеке, как приведено в описании класса QDialog.
В конструкторе класса диалога предусмотри указатель на данные, либо пользуйся внутри диалога классом-Одиночкой (менее предпочтительно).


Название: Re: Вопрос по созданию нового окна
Отправлено: Snak2013 от Март 31, 2017, 12:19
Доброго времени суток, пишу свой вопрос в эту тему потому как он тоже касается создания окна. В проекте я добавил диалоговое окно и хочу передать в него параметры полученные ранее, для этого пытаюсь изменить конструктор который создает QTCreator по умолчанию, выглядит это так:
Заголовочный файл:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDialog>
#include "stdafx.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QDialog
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0, KompasObjectPtr _kompas = NULL, IApplicationPtr _application = NULL);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    KompasObjectPtr _kompas;
    IApplicationPtr _application;
};

#endif // MAINWINDOW_H

Cpp файл:

Код:
MainWindow::MainWindow(QWidget *parent, KompasObjectPtr _kompas, IApplicationPtr _application) :
    QDialog(parent),
    ui(new Ui::MainWindow)
{
    this->_application = _application;
    this->_kompas = _kompas;
    ui->setupUi(this);
}

Код не компилируется выдавая ошибку :

D:\projects\QTProjects\KompasCalculating\mainwindow.h:23: ошибка: C2248: QDialog::QDialog: невозможно обратиться к private член, объявленному в классе "QDialog"
d:\qt_5.4.0\5.5\msvc2013\include\qtwidgets\qdialog.h(109): см. объявление "QDialog::QDialog"
d:\qt_5.4.0\5.5\msvc2013\include\qtwidgets\qdialog.h(45): см. объявление "QDialog"
Сообщение диагностики возникло в созданной компилятором функции "MainWindow::MainWindow(const MainWindow &)"

Пожалуйста подскажите где я ошибся?