Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Yagoz от Февраль 26, 2018, 19:31



Название: Динамическое создание элементов
Отправлено: Yagoz от Февраль 26, 2018, 19:31
Выпала мне участь писать приложение на C++, для чего я выбрал Qt
Сразу отмечу, что опыта в программировании катастрофически мало

Теперь к сути:
Приложение обрабатывает txt файл, откуда берет по три значения из строчки
Одно значение должно использоваться для имени элемента, два остальных выводятся при нажатии/наведении мыши на элемент
Так же, в зависимости от последних двух параметров должна выбираться конкретная иконка
Как это реализовать? Я вижу вариант с беспрерывным созданием кнопок на форме и созданием своего объекта класса

Вариант с кнопками более менее понятен, но скорее всего очень неудобен
Про классы и объекты, особенно их создание я ничего не знаю

Буду рад ссылкам на статьи с примерами, кускам кодов и объяснениям "для чайников"


Название: Re: Динамическое создание элементов
Отправлено: qate от Февраль 27, 2018, 08:37
какие книги по qt ты уже прочитал ?


Название: Re: Динамическое создание элементов
Отправлено: Day от Февраль 27, 2018, 10:14
У всех виджетов есть такой метод - setToolTip - установка "воздушной" подсказки - то что всплывает при наведении мышки


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Февраль 27, 2018, 21:09
какие книги по qt ты уже прочитал ?
К сожалению ни одной из-а банальной нехватки времени


Название: Re: Динамическое создание элементов
Отправлено: Day от Февраль 27, 2018, 21:28
Цитировать
из-а банальной нехватки времени
Конечно, лучше его тратить на нелепые вопросы, выхватывание каких-то не относящихся к делу кусков из статей и примеров и строить дом, не понимая, что такое кирпичи...


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Февраль 28, 2018, 11:23
Цитировать
из-а банальной нехватки времени
Конечно, лучше его тратить на нелепые вопросы, выхватывание каких-то не относящихся к делу кусков из статей и примеров и строить дом, не понимая, что такое кирпичи...
А если по делу?
Было бы это дело по моей инициативе - нашел бы для него время, подошел бы более основательно.  А так мне просто надо сделать и забыть.


Название: Re: Динамическое создание элементов
Отправлено: ssoft от Февраль 28, 2018, 13:17
Описываемая задача, как раз подходит для самостоятельного изучения Qt.
Решение достаточно простое - кнопки накидать, таблицу сбацать или даже модель для вьюшек сформировать.
Просто никто не хочет делать эту работу за другого, а потом еще и объяснять как это сделано.
Если что-то написали - выкладывайте проект и спрашивайте по существу, что не получается.

А если по делу?
Было бы это дело по моей инициативе - нашел бы для него время, подошел бы более основательно.  А так мне просто надо сделать и забыть.

А так, то предлагаю сразу забыть) и не мучаться.


Название: Re: Динамическое создание элементов
Отправлено: ViTech от Февраль 28, 2018, 13:27
Поиск в гугле "qt tutorial":
Qt for Beginners (https://wiki.qt.io/Qt_for_Beginners)
Qt Examples And Tutorials (https://doc-snapshots.qt.io/qt5-5.9/qtexamplesandtutorials.html)

Теперь к сути:
Приложение обрабатывает txt файл, откуда берет по три значения из строчки
Одно значение должно использоваться для имени элемента, два остальных выводятся при нажатии/наведении мыши на элемент
Так же, в зависимости от последних двух параметров должна выбираться конкретная иконка
Как это реализовать? Я вижу вариант с беспрерывным созданием кнопок на форме и созданием своего объекта класса

В итоге что должно получиться-то? :)

Creating a Qt Widget Based Application (http://doc.qt.io/qtcreator/creator-writing-program.html)
Layout Management (https://doc-snapshots.qt.io/qt5-5.9/layout.html)


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Февраль 28, 2018, 14:08
А так, то предлагаю сразу забыть) и не мучаться.

Я бы с радостью, только есть слово "надо"

В общем, на данный момент попробую организовать собственный виджет, будут вопросы-задам


Название: Re: Динамическое создание элементов
Отправлено: deMax от Март 02, 2018, 16:07
Определились с элементом на который будете нажимать?
Если QPushButton визуально не нравиться, его можно стилем допилить.
Не хотите ему изменять стиль, можно QLabel взять(ему нажималку сделать надо)


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Март 06, 2018, 20:22
Определились с элементом на который будете нажимать?
... можно QLabel взять(ему нажималку сделать надо)

Остановился на QLabel
На данный момент как раз возник вопрос.
Как было оговорено, изображение подбирается в зависимости от параметров из файла
Я вижу два варианта реализации:
1) Функция подбирающая пикчу и возвращающая ее через Pixmap типа QPixmap picselect (...) {... return pic;}
2) Функция подбирающая пикчу и возвращающая путь к ней

Какой из этих вариантов будет являться рабочими наименее замороченным?


Название: Re: Динамическое создание элементов
Отправлено: Bepec от Март 07, 2018, 15:39
Любой, который вы сможете реализовать.

Ну и чисто благотворительность :D (файл с тем же кодом доступен внизу в приложении)

Код:
QPixmap getPixmap(QString param1, QString param2)
{
    // тут получаем картинку. В данном случае картинку будем получать из того что первый параметр папка, второй название файла
    // т.е. к примеру getPixmap("c:/myPicture","abort.png");
    // получаем pix = "картинка по пути c:/myPicture/abort.png"
    QPixmap pix = QPixmap(param1 +"/"+ param2);
    return pix;
}

void parseFileAndCreateLabel()
{
    // строчки из файла
    QStringList listString;
    // список лейблов
    QList<QLabel> listLabel;
    // разделитель
    QString separator = "\t";
    // цикл по строкам
    for (int i = 0; i < listString.size() ;i++)
    {
        // разбиваем строку по разделителю( в данном случае символ табуляции)
        QStringList tempData = listString[i].split(separator);
        // проверка на количество значений.
        if (tempData.size != 3)
        {
            // вывод сообщения об ошибке, берём следующую строку. Но эт чисто для теста, ибо если таких будет много заколебаетесь щелкать :D
            QMessageBox::alert(this, "Error", QString("Corrupted string") + listString[i] , QMessageBox::Ok);
            // переходим в начало цикла к следующей строке
            continue;
        }
        // создаём лейбл
        QLabel* label = new QLabel;
        // пихаем текст
        label.setText(tempData[0]);
        // запрашиваем картинку
        QPixmap pix = getPixmap(tempData[1],tempData[2]);
        // пихаем картинку.
        label->setPixmap(pix);
        // всё готово, пихаем лейбл в списочек готовых
        listLabel.append(label);
    }
    // цикл по всем лейблам
    for (int i = 0; i < listLabel.size() ;i++)
    {
        // добавляем на форму. Вместо verticalLayout подставляем свой layout который на форме, или свой
        ui->verticalLayout->addWidget(listLabel[i]);
    }
}


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Март 09, 2018, 13:13
Ну и чисто благотворительность :D

Большое спасибо за пример, разобрался, завелось)


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Март 20, 2018, 16:32
Вновь возникли вопросы
Все касательно компоновки в QScrollArea
По информации которую я нашел,рабочим вариантом является запихивание компоновки в QWidget, а его в QScrollArea. Сами объекты для компоновки в компоновку

Часть прописанная в описании формы:
Код:
QGridLayout* grid = new QGridLayout;
    QWidget* widget = new QWidget(this);
    widget->setLayout(grid);
    ui->scrollArea->setWidget(widget);
    grid->addWidget(ui->label1);

1)Каким образом все это должно создаваться: программно или можно ручками на форму?
2)Если все прописано в описании, то как сослаться на grid из обработчика кнопки (через ui->...grid-> не пашет)?




Название: Re: Динамическое создание элементов
Отправлено: Day от Март 20, 2018, 17:25
Цитировать
как сослаться на grid
Код
C++ (Qt)
widget->layout();
 


Название: Re: Динамическое создание элементов
Отправлено: Yagoz от Март 20, 2018, 19:28
Сейчас запихал все в обработчик (что не очень то и красиво), естественно все пашет
НО grid компонует в столбец

Код:
void Project::on_buttonStart_clicked()
{

    QRect bstyle;  // мб оно и не нужно
    bstyle.setWidth(1000);
    bstyle.setHeight(1000);

    QGridLayout* grid = new QGridLayout();
    grid->setGeometry(bstyle);
    QWidget* widget = new widget(this);
    widget->setGeometry(bstyle);
    widget->setLayout(grid);
    ui->scrollArea->setWidget(widget);

    .............................// тело обработчика

    grid->addWidget(newobj);

1)Как поправить компоновку? Возможно я забыл про какие то параметры или не учел особенности
2)Как обратиться к объекту вне обработчика? Не хочется держать компоновку и стили внутри обработчика

UPDATE: установил фон для формы, заметил, что все объекты попадающие в grid заполняют его построчно во всю ширину ScrollArea
UPD2: лихо просрался с документацией. Для тех кто ищет: grid->addWidget(имя_виджета, №строки в grid, №столбца в grid)


Название: Re: Динамическое создание элементов
Отправлено: gil9red от Март 23, 2018, 11:33
Цитировать
НО grid компонует в столбец

Цитировать
grid->addWidget(newobj);

Что написали, то и получили :)

Используйте вариант функции с указанием строки и столбца:

Код
C++ (Qt)
void QGridLayout::addWidget(QWidget * widget, int row, int column, Qt::Alignment alignment = 0)


Название: Re: Динамическое создание элементов
Отправлено: Igors от Март 23, 2018, 15:23
Да, есть совершенно идиотские фразы которые люди почему-то упорно повторяют, напр
Цитировать
- мне очень нужны деньги (а кому же они не нужны?)
Или вот не хуже
Цитировать
- у меня нет времени (а у других, значит, на меня есть)
..лихо просрался с документацией.
А чего ж Вы, не просравшись, на форум полезли?


Название: Re: Динамическое создание элементов
Отправлено: deMax от Март 29, 2018, 09:48
Вообще неплохо по qt книжку прочитать, хоть в qt и замечательная справка, но знания азов уберут множество глупых вопросов. (это не долго)