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

Очень буду рад помощи)
eldar85
Возможно нужно воспользоваться Qt Script... Да уж, ни одного ответа, ниужели никто такого не делал...
Алексей1153
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
да смотрел, пробовал вот так:

    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
а что тут делается, расскажи. Я не совсем понимаю что-то :)
    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"));
eldar85
ооо вот это уже интересно))) я проста вот так динамически по ходу работы программы ни раз не менял ГУИ)) сейчас попробую)
Алексей1153
eldar85, хм, классы - они и в ГУЕ (извиняюсь) классы
eldar85

все понял)
eldar85
получилось)))

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"));
}


а что в моем то классе не так?
Алексей1153
не пойму, что ты делаешь. Зачем всё подряд вставляешь на таб ? На таб нужно вставлять только страницы твоего класса myPage
eldar85
отличненько, разобрался)

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 "));
Алексей1153
молодец :)
eldar85
Большое спасибо за помощь)
FantasyOr
для 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;
    }
}





в общем случае примерно так. Может топорно? профи критикуйте пожалуйста
Litkevich Yuriy
FantasyOr, пользуйся кнопками/тэгами оформления кода.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.