crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

eldar85
  опции профиля:
сообщение 2.12.2010, 3:19
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Хочу сделать что то на подобии ICQ, только для вконтакте, чтобы человек мог ввести аккаунт в эту программу и нажать - "залогиниться" и она вышла в сеть и проверила входящие, если есть то открывает для каждого написавшего свою вкладку в табВиджете.
Сделал в дизайнере внешний вид - поставил qtabWidget с одной вкладкой, поставил в нее один техтБраузер, один техтЭдит, пару кнопок и все. программа запустилось все нормально, но по ходу работы программы могут постучатся несколько человек, поэтому должны открыться другие вклидки табВиджета с такими же виджетами что и в первой вкладке. Только вот как это сделать??? как на ходу добавлять виджеты и вкладки таб виджета?
исходники выкладывать пока не имеет смысла так как пока все набросано только в дизайнере и кнопки соеденены со слотами. Они никак не относятся к виджетам, только помещают сообщение в техт едит.

Очень буду рад помощи)

Сообщение отредактировал eldar85 - 2.12.2010, 12:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 14)
eldar85
  опции профиля:
сообщение 2.12.2010, 13:56
Сообщение #2


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возможно нужно воспользоваться Qt Script... Да уж, ни одного ответа, ниужели никто такого не делал...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 14:02
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


eldar85, а ты уже посмотрел справку по QTabWidget ?

Цитата
int QTabWidget::addTab ( QWidget * page, const QString & label )
Adds a tab with the given page and label to the tab widget, and returns the index of the tab in the tab bar.

If the tab's label contains an ampersand, the letter following the ampersand is used as a shortcut for the tab, e.g. if the label is "Bro&wse" then Alt+W becomes a shortcut which will move the focus to this tab.

Note: If you call addTab() after show(), the layout system will try to adjust to the changes in its widgets hierarchy and may cause flicker. To prevent this, you can set the QWidget::updatesEnabled property to false prior to changes; remember to set the property to true when the changes are done, making the widget receive paint events again.

See also insertTab().

int QTabWidget::addTab ( QWidget * page, const QIcon & icon, const QString & label )
This is an overloaded function.

Adds a tab with the given page, icon, and label to the tab widget, and returns the index of the tab in the tab bar.

This function is the same as addTab(), but with an additional icon.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 2.12.2010, 14:16
Сообщение #4


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


да смотрел, пробовал вот так:

    list << "qwe" << "rty" << "yui" << "iop" << "asd" << "dfg" << "hjk";

    textBrowser = new QTextBrowser[list.size() + 1];
    groupBox = new QGroupBox[list.size() + 1];
    layoutV = new QVBoxLayout[list.size() + 1];
    pushButton = new QPushButton[list.size() + 1];
    textEdit = new QTextEdit[list.size() + 1];

    for(int i = 0; i < list.size(); i++)
    {
        layoutV[i].addWidget(&textBrowser[i]);
        layoutV[i].addWidget(&pushButton[i]);
        layoutV[i].addWidget(&textEdit[i]);
        groupBox[i].setLayout(&layoutV[i]);
    }


но это просто для тестов что получиьтся, вроде вылазиют вкладки но при закрытии проги она дает ошибку и не известно же в начале сколько у меня будет окон, 5 или 25. Вот тут и запутался.

это я пробовал прям в конструкторе, было рпедложение изначально создать 100 окон и потом делать их видимыми. Но думаю есть более правильные подход, его только найти нужно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 14:17
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а что тут делается, расскажи. Я не совсем понимаю что-то :)
    textBrowser = new QTextBrowser[list.size() + 1];
    groupBox = new QGroupBox[list.size() + 1];
    layoutV = new QVBoxLayout[list.size() + 1];
    pushButton = new QPushButton[list.size() + 1];
    textEdit = new QTextEdit[list.size() + 1];


вернее, понимаю - создаются массивы виджетов. А зачем именно массивы ?

по моему, надо как-то так
        QTabWidget tab(this);
        tab.addTab(new CMyBelovedPage(...),QString("1"));
        tab.addTab(new CMyBelovedPage(...),QString("2"));
        tab.addTab(new CMyBelovedPage(...),QString("3"));
        tab.addTab(new CMyBelovedPage(...),QString("4"));


Сообщение отредактировал Алексей1153 - 2.12.2010, 14:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 2.12.2010, 14:42
Сообщение #6


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


ооо вот это уже интересно))) я проста вот так динамически по ходу работы программы ни раз не менял ГУИ)) сейчас попробую)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 2.12.2010, 14:44
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


eldar85, хм, классы - они и в ГУЕ (извиняюсь) классы

Сообщение отредактировал Алексей1153 - 2.12.2010, 14:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 2.12.2010, 14:47
Сообщение #8


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  



все понял)

Сообщение отредактировал eldar85 - 2.12.2010, 14:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 3.12.2010, 7:02
Сообщение #9


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


получилось)))

myPage::myPage()
{
    pushButton = new QPushButton;
    textEdit = new QTextEdit;
    groupBox = new QGroupBox;
    layoutV = new QVBoxLayout;
    layoutV->addWidget(textEdit);
    layoutV->addWidget(pushButton);
    groupBox->setLayout(layoutV);
}



void MainWindow::start()
{
    myPage* page = new myPage;
    ui->tabWidget->addTab(page->groupBox, QString("123"));
}


только как сделать чтобы он как у тебя запускал как то так

void MainWindow::start()
{

    ui->tabWidget->addTab( new myPage(), QString("123"));
}


не получается, извиняюсь что туплю но не делал так никогда...

вроде как в документации

    
ui->tabWidget->addTab(new QWidget(),nameCategory->text())


вот так вот вставляет текстЕдит

void MainWindow::start()
{
    ui->tabWidget->addTab( new QTextEdit, QString("123"));
}


а что в моем то классе не так?

Сообщение отредактировал eldar85 - 3.12.2010, 6:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.12.2010, 7:53
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


не пойму, что ты делаешь. Зачем всё подряд вставляешь на таб ? На таб нужно вставлять только страницы твоего класса myPage
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 3.12.2010, 19:25
Сообщение #11


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


отличненько, разобрался)

myPage::myPage(QString str, QWidget *parent) :
        QWidget(parent)
{
    textEdit = new QTextEdit;

    textBrowser = new QTextBrowser;
    groupBox = new QGroupBox(tr("WWW"));
    pushButon = new QPushButton(tr("Отправить"));

    pushButon->setShortcut(QKeySequence("CTRL+Return"));

    QVBoxLayout* layoutV = new QVBoxLayout;
    QHBoxLayout* layoutH = new QHBoxLayout;
    QVBoxLayout* mainLayout = new QVBoxLayout;
    layoutH->addStretch();
    layoutH->addWidget(pushButon);
    layoutV->addWidget(&webView);
    layoutV->addLayout(layoutH);
    layoutV->addWidget(textEdit);
    groupBox->setLayout(layoutV);
    mainLayout->addWidget(groupBox);
    connect(pushButon, SIGNAL(clicked()), this, SLOT(text()));

    url = str;

    setLayout(mainLayout);
}


====================================================
ui->tabWidget->addTab(new myPage("http://google.ru"), QString("Eldar "));


Сообщение отредактировал eldar85 - 3.12.2010, 19:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.12.2010, 19:28
Сообщение #12


фрилансер
******

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


молодец :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 3.12.2010, 19:48
Сообщение #13


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо за помощь)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 17.12.2010, 17:48
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


для eldar85


myPage::myPage()
{
pushButton = new QPushButton;
textEdit = new QTextEdit;
groupBox = new QGroupBox;
layoutV = new QVBoxLayout;
layoutV->addWidget(textEdit);
layoutV->addWidget(pushButton);
groupBox->setLayout(layoutV);
}

не забудь давать перентов элементам через new:

myPage::myPage()
{
pushButton = new QPushButton(this);
textEdit = new QTextEdit(this);
groupBox = new QGroupBox(this);
layoutV = new QVBoxLayout(this);
layoutV->addWidget(textEdit);
layoutV->addWidget(pushButton);
groupBox->setLayout(layoutV);
}

чтоб память руками не чистить в деструкторе, а то если и в деструкторе забудешь, то твоя прога будет беспощадно жрать память у очень общительных людей =)

Алексей1153 дело говорит:

myPage::myPage() унаследуй от QWidget, а не закладку добавляй свой класс.
Динамически это самое интересное
пример класса, который добавляется динамически:
class TAdditionalRouteWidget : public QWidget
{
    Q_OBJECT
public:
    TAdditionalRouteWidget(QWidget *parent = 0);
    ~TAdditionalRouteWidget();
             ...
             ...
signals:
    void deleteClick();
    void switchClick();
    void changedRoute();
private:
    QHBoxLayout *FLayout;
    QTextEdit *teAdditionalRoutes;
    QPushButton *btnDelRoute;
    QPushButton *btnSwitchRoute;
private slots:
    void slt_deleteClick();
    void slt_switchClick();
    void slt_changedRoute();
};


TAdditionalRouteWidget::TAdditionalRouteWidget(QWidget *parent)
    : QWidget(parent)
{
    FLayout = new QHBoxLayout(this);
    FLayout->setContentsMargins(0, 0, 0, 0);

    teAdditionalRoutes = new QTextEdit(this); 

    btnDelRoute = new QPushButton(this);
    btnDelRoute->setStatusTip(tr("Удалить маршрут"));
    btnDelRoute->setIcon(QIcon(":/Resources/Recycle.png"));
    btnDelRoute->setIconSize(QSize(32, 32));

    btnSwitchRoute = new QPushButton(this);
    btnSwitchRoute->setStatusTip(tr("Сделать главным")); 
    btnSwitchRoute->setIcon(QIcon(":/Resources/Switch.png"));
    btnSwitchRoute->setIconSize(QSize(32, 32));

    FLayout->addWidget(teAdditionalRoutes);
    FLayout->addWidget(btnSwitchRoute);
    FLayout->addWidget(btnDelRoute);
    FLayout->addStretch();

    teAdditionalRoutes->setFixedHeight(50);

    QObject::connect(btnDelRoute, SIGNAL(clicked()), this, SLOT(slt_deleteClick()));
    QObject::connect(btnSwitchRoute, SIGNAL(clicked()), this, SLOT(slt_switchClick()));
    QObject::connect(teAdditionalRoutes, SIGNAL(textChanged()), this, SLOT(slt_changedRoute()));

    setLayout(FLayout);
}


Пример динамического добавления и удаления класса:
процедура добавления нового виджета маршрута
{
    TAdditionalRouteWidget *ar = new TAdditionalRouteWidget(this);
    FRoutesLayout->insertWidget(FAdditionalRoutes.size(), ar);
    FAdditionalRoutes.push_back(ar);

    QObject::connect(ar, SIGNAL(deleteClick()), this, SLOT(slt_DelRoute()));
    QObject::connect(ar, SIGNAL(switchClick()), this, SLOT(slt_SwitchRoute()));
    QObject::connect(ar, SIGNAL(changedRoute()), this, SLOT(slt_ChangedRoute()));
}

процедура удаления виджета
slt_DelRoute()
{
    TAdditionalRouteWidget *ar = dynamic_cast<TAdditionalRouteWidget *>(sender());
    int idx = FAdditionalRoutes.indexOf(ar);
    if (idx != -1)
    {
        ar = FAdditionalRoutes.takeAt(idx);
        FRoutesLayout->removeWidget(ar);
        delete ar;
    }
}





в общем случае примерно так. Может топорно? профи критикуйте пожалуйста

Сообщение отредактировал FantasyOr - 18.12.2010, 13:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.12.2010, 18:54
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


FantasyOr, пользуйся кнопками/тэгами оформления кода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 27.6.2025, 11:08