Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2013, 13:56   #1
NataPl
Пользователь
 
Аватар для NataPl
 
Регистрация: 26.02.2013
Сообщений: 38
Радость Qt - массивы виджетов роняют программу

Пишу многовкладочный веб браузер. Компиляция программы проходит нормально, но среда выдает сообщение о том что "Программа неожиданно завершилась". вот код:

quad.h
Код:
#ifndef QUAD_H
#define QUAD_H

#include <QMainWindow>
#include <QTabWidget>
#include <QtWebKitWidgets/QWebView>
#include <QTimer>
#include <QPushButton>
#include <QLineEdit>


class Quad : public QMainWindow
{
    Q_OBJECT

public:
    Quad(QWidget *parent = 0);
    ~Quad();
    QTabWidget *tabs;
    QWebView *view[100];
    QWidget *tab_widget[100];
    QPushButton *back_btn[100];
    QPushButton *forward_btn[100];
    QPushButton *reload_btn[100];
    QPushButton *go_btn[100];
    QLineEdit *http_edit[100];
    QTimer *resizer_timer;
    int final_tab;
    int cur;
public slots:
   void CreateElements();
   void SetWindowSize();
   void Resizer();
   void CreateTab(int maxtab);

};

#endif // QUAD_H
main.cpp
Код:
#include "quad.h"
#include <QApplication>
#include <QSettings>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Quad window;
    QCoreApplication::setOrganizationName("Nata Software");
    QCoreApplication::setOrganizationDomain("nata.com");
    QCoreApplication::setApplicationName("Just Browser");
    QString set_dir = QCoreApplication::applicationDirPath();
    QSettings size_window_settings(set_dir+"window_size.ini", QSettings::IniFormat);
    QByteArray geom = size_window_settings.value("Size/Browser").toByteArray();
    window.restoreGeometry(geom);
    window.show();
    return app.exec();
}
quad.cpp
Код:
#include "quad.h"
#include <QtWebKitWidgets/QWebView>
#include <QTabWidget>
#include <QSettings>
#include <QApplication>
#include <QTimer>
#include <QPushButton>
#include <QLineEdit>

Quad::Quad(QWidget *parent)
    : QMainWindow(parent)
{
    CreateElements();
    CreateTab(0);
}

void Quad::CreateTab(int maxtab)
{
    cur=maxtab++;
    tab_widget[cur] = new QWidget;
    back_btn[cur] = new QPushButton(tab_widget[cur]);
    forward_btn[cur] = new QPushButton(tab_widget[cur]);
    reload_btn[cur] = new QPushButton(tab_widget[cur]);
    go_btn[cur] = new QPushButton(tab_widget[cur]);
    http_edit[cur] = new QLineEdit(tab_widget[cur]);

}

void Quad::CreateElements()
{
    tabs = new QTabWidget(this);
    tabs->setTabsClosable(true);
    tabs->setMovable(true);
    resizer_timer = new QTimer(this);
    connect(resizer_timer, SIGNAL(timeout()), this, SLOT(Resizer()));
    resizer_timer->start(10);
    CreateTab(666);
}

void Quad::Resizer()
{
    tabs->resize(width(), height());
}

Quad::~Quad()
{
    SetWindowSize();
}

void Quad::SetWindowSize()
{
    QString set_dir = QCoreApplication::applicationDirPath();
    QSettings size_window_settings(set_dir+"window_size.ini", QSettings::IniFormat);
    size_window_settings.setValue("Size/Browser",this->saveGeometry());
}
Проблема видимо в участке кода
Код:
void Quad::CreateTab(int maxtab)
{
    cur=maxtab++;
    tab_widget[cur] = new QWidget;
    back_btn[cur] = new QPushButton(tab_widget[cur]);
    forward_btn[cur] = new QPushButton(tab_widget[cur]);
    reload_btn[cur] = new QPushButton(tab_widget[cur]);
    go_btn[cur] = new QPushButton(tab_widget[cur]);
    http_edit[cur] = new QLineEdit(tab_widget[cur]);

}
если в этом участке кода cur на 1:
Код:
void Quad::CreateTab(int maxtab)
{
    
    tab_widget[1] = new QWidget;
    back_btn[1] = new QPushButton(tab_widget[1]);
    forward_btn[1] = new QPushButton(tab_widget[1]);
    reload_btn[1] = new QPushButton(tab_widget[1]);
    go_btn[1] = new QPushButton(tab_widget[1]);
    http_edit[1] = new QLineEdit(tab_widget[1]);

}
то работает нормально...но по сути 1 это int и переменная cur типа int, поетому не могу понять что от меня хочет компилятор((
NataPl вне форума Ответить с цитированием
Старый 08.10.2013, 16:29   #2
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Это вы круто посылать CreateTab(666); когда у вас массиве всего 100 элементов:

Код:
Quad::Quad(QWidget *parent)
    : QMainWindow(parent)
{
    CreateElements();
    CreateTab(0);
}
Код:
void Quad::CreateElements()
{
    tabs = new QTabWidget(this);
    tabs->setTabsClosable(true);
    tabs->setMovable(true);
    resizer_timer = new QTimer(this);
    connect(resizer_timer, SIGNAL(timeout()), this, SLOT(Resizer()));
    resizer_timer->start(10);
    CreateTab(666);
}
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 08.10.2013, 21:02   #3
NataPl
Пользователь
 
Аватар для NataPl
 
Регистрация: 26.02.2013
Сообщений: 38
По умолчанию

та то старый кусок кода:
Код:
CreateTab(666);
он уже не нужен там)
NataPl вне форума Ответить с цитированием
Старый 09.10.2013, 12:24   #4
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

[QUOTE=NataPl;1283900]та то старый кусок кода:
Код:
CreateTab(666);
Ладно хорошо, старый. Но советую вместо явного выделения памяти пользоваться контейнерами типа QList.
Да и больно расточительно начинать заполнение массива с 1 когда отчет ведется с 0.
Код:
Quad::Quad(QWidget *parent)
    : QMainWindow(parent)
{
    CreateElements();
    CreateTab(0);
}
Код:
void Quad::CreateTab(int maxtab)
{
    cur=maxtab++; //это уже будет индекс равен 1, а про нулевой забыли.
    tab_widget[cur] = new QWidget;
    back_btn[cur] = new QPushButton(tab_widget[cur]);
    forward_btn[cur] = new QPushButton(tab_widget[cur]);
    reload_btn[cur] = new QPushButton(tab_widget[cur]);
    go_btn[cur] = new QPushButton(tab_widget[cur]);
    http_edit[cur] = new QLineEdit(tab_widget[cur]);
}
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить программу. Массивы Katerina*** Паскаль, Turbo Pascal, PascalABC.NET 9 23.11.2012 08:40
Где находятся конструкторы виджетов. Farrel Qt и кроссплатформенное программирование С/С++ 1 24.05.2011 20:16
Зависимости виджетов Tema_Crazzzy Общие вопросы C/C++ 3 29.10.2010 10:58
Массивы(исправить программу) ilyas22 Паскаль, Turbo Pascal, PascalABC.NET 3 26.05.2010 22:35