Russian Qt Forum
Ноябрь 24, 2024, 10:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: управление окнами MDI  (Прочитано 12072 раз)
jerdeks
Гость
« Ответ #15 : Март 25, 2010, 10:56 »

Цитировать
но к элементам главной формы все равно не обратиться
эт смотря как ты подключил ui в свою форму, если ui в private засунул, то конечно не обратишься из другого класса.
обе формы в public. по кнопке из одной формы должно меняться WindowTitle другой формы. все компилица, но когда нажимаю кнопку, вылетает с ошибкой сегментации
Подробнее механизм опять же в доках. Кажется в книжке Бланшета (или у Шлее) описано все это было...
странные книжки. вроде и много всего, а чего надо не найти))

попробую с сигналами и слотами разобраться...
Записан
voronElf
Гость
« Ответ #16 : Март 25, 2010, 11:40 »

Цитировать
вылетает с ошибкой сегментации
с инициализацией адресов окон посмотри или код выложи

Цитировать
странные книжки. вроде и много всего, а чего надо не найти))
ну это не справочники, они для изучения ...
Записан
jerdeks
Гость
« Ответ #17 : Март 25, 2010, 20:21 »

mainwindow.cpp:
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "caesar.h"
#include <QMdiArea>
#include <QMdiSubWindow>

QWidget *widget;
caesar *form_caesar;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MainWindow::setCentralWidget(ui->mdiArea);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::on_action_triggered()
{
    form_caesar = new caesar;
    ui->mdiArea->addSubWindow(form_caesar);
    form_caesar->show();
}

mainwindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

[b]class caesar; // класс второй формы[/b]

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    Ui::MainWindow *ui;
    [b]caesar* caesar_w;   // как сказали сделать указатель на вторую форму[/b]

protected:
    void changeEvent(QEvent *e);

private:

private slots:
    void on_action_triggered();

};

#endif // MAINWINDOW_H

caesar.cpp:
Код:
#include "caesar.h"
#include "ui_caesar.h"
#include "mainwindow.h"

caesar::caesar(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::caesar)
{
    ui->setupUi(this);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
}

caesar::~caesar()
{
    delete ui;
}

void caesar::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void caesar::on_pushButton_clicked()
{
    mw->setWindowTitle("12345");
}

caesar.h:
Код:
#ifndef CAESAR_H
#define CAESAR_H

#include <QWidget>

namespace Ui {
    class caesar;
}

class MainWindow;

class caesar : public QWidget {
    Q_OBJECT
public:
    caesar(QWidget *parent = 0);
    ~caesar();
    MainWindow* mw;

protected:
    void changeEvent(QEvent *e);

private:
    Ui::caesar *ui;

private slots:
    void on_pushButton_clicked();

};

#endif // CAESAR_H


Эта прога, так-то алгоритм цезаря. Я про то, чтобы названию формы "caesar" не удилялись))
« Последнее редактирование: Март 25, 2010, 20:23 от jerdeks » Записан
voronElf
Гость
« Ответ #18 : Март 26, 2010, 06:26 »

Код:
void caesar::on_pushButton_clicked()
{
    mw->setWindowTitle("12345");
}

не увдел, где значение mw инициалзизируется, если нигде, то из-за этого и вылетает

ну и мелочи: зачем в mainwindow.cpp глобальные переменные нужны ? глобальные переменные это зло
Записан
jerdeks
Гость
« Ответ #19 : Март 26, 2010, 09:29 »

не увдел, где значение mw инициалзизируется, если нигде, то из-за этого и вылетает

ааааа.. инициализироваться - это new, да? щас попробую
Записан
jerdeks
Гость
« Ответ #20 : Март 26, 2010, 09:56 »

в файле caesar.cpp написал

mw = new MainWindow;

вот такая вот ошибка:
error: expected constructor, destructor, or type conversion before ‘=’ token

перенес вот сюда:
Код:
caesar::caesar(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::caesar)
{
    ui->setupUi(this);
    lib.load();

    mw = new MainWindow; // <----
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("Windows-1251"));
}

теперь компилица, даже кнопочка нажимается, но ничего не происходит
« Последнее редактирование: Март 26, 2010, 10:03 от jerdeks » Записан
voronElf
Гость
« Ответ #21 : Март 26, 2010, 10:20 »

мда ...

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

Через параметр конструктора инициалзируй.

ПС: а если сейчас сделать mw->show(); удивительная вещь произойдет )))
Записан
jerdeks
Гость
« Ответ #22 : Март 26, 2010, 10:41 »

да уж.. )))

а как через параметр конструктора инициализировать?
Записан
jerdeks
Гость
« Ответ #23 : Март 26, 2010, 16:47 »

связал сигнал со слотом и все заработало. круто. но вопрос остается в силе
Записан
voronElf
Гость
« Ответ #24 : Март 29, 2010, 05:59 »

ну чтож, как-то так:

caesar.h:
Код:
class MainWindow;

class caesar : public QWidget {
    Q_OBJECT
public:
    caesar(MainWindow * mainWnd, QWidget *parent = 0);
    ~caesar();
private:
    MainWindow* mw;
.....


caesar.cpp :
Код:
caesar::caesar(MainWindow * mainWnd, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::caesar)
{
    ui->setupUi(this);
    mw = mainWnd;
........
}

ну и использование в классе MainWindow:
Код:
void MainWindow::on_action_triggered()
{
    form_caesar = new caesar(this);
}


Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.