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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Динамическое создание элементов  (Прочитано 11741 раз)
Yagoz
Гость
« : Февраль 26, 2018, 19:31 »

Выпала мне участь писать приложение на C++, для чего я выбрал Qt
Сразу отмечу, что опыта в программировании катастрофически мало

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

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

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

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Февраль 27, 2018, 08:37 »

какие книги по qt ты уже прочитал ?
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #2 : Февраль 27, 2018, 10:14 »

У всех виджетов есть такой метод - setToolTip - установка "воздушной" подсказки - то что всплывает при наведении мышки
Записан
Yagoz
Гость
« Ответ #3 : Февраль 27, 2018, 21:09 »

какие книги по qt ты уже прочитал ?
К сожалению ни одной из-а банальной нехватки времени
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #4 : Февраль 27, 2018, 21:28 »

Цитировать
из-а банальной нехватки времени
Конечно, лучше его тратить на нелепые вопросы, выхватывание каких-то не относящихся к делу кусков из статей и примеров и строить дом, не понимая, что такое кирпичи...
Записан
Yagoz
Гость
« Ответ #5 : Февраль 28, 2018, 11:23 »

Цитировать
из-а банальной нехватки времени
Конечно, лучше его тратить на нелепые вопросы, выхватывание каких-то не относящихся к делу кусков из статей и примеров и строить дом, не понимая, что такое кирпичи...
А если по делу?
Было бы это дело по моей инициативе - нашел бы для него время, подошел бы более основательно.  А так мне просто надо сделать и забыть.
« Последнее редактирование: Февраль 28, 2018, 12:09 от Yagoz » Записан
ssoft
Программист
*****
Online Online

Сообщений: 584


Просмотр профиля
« Ответ #6 : Февраль 28, 2018, 13:17 »

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

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

А так, то предлагаю сразу забыть) и не мучаться.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Февраль 28, 2018, 13:27 »

Поиск в гугле "qt tutorial":
Qt for Beginners
Qt Examples And Tutorials

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

В итоге что должно получиться-то? Улыбающийся

Creating a Qt Widget Based Application
Layout Management
Записан

Пока сам не сделаешь...
Yagoz
Гость
« Ответ #8 : Февраль 28, 2018, 14:08 »

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

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

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

Сообщений: 600



Просмотр профиля
« Ответ #9 : Март 02, 2018, 16:07 »

Определились с элементом на который будете нажимать?
Если QPushButton визуально не нравиться, его можно стилем допилить.
Не хотите ему изменять стиль, можно QLabel взять(ему нажималку сделать надо)
« Последнее редактирование: Март 02, 2018, 16:10 от deMax » Записан
Yagoz
Гость
« Ответ #10 : Март 06, 2018, 20:22 »

Определились с элементом на который будете нажимать?
... можно QLabel взять(ему нажималку сделать надо)

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

Какой из этих вариантов будет являться рабочими наименее замороченным?
Записан
Bepec
Гость
« Ответ #11 : Март 07, 2018, 15:39 »

Любой, который вы сможете реализовать.

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

Код:
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]);
    }
}
Записан
Yagoz
Гость
« Ответ #12 : Март 09, 2018, 13:13 »

Ну и чисто благотворительность Веселый

Большое спасибо за пример, разобрался, завелось)
Записан
Yagoz
Гость
« Ответ #13 : Март 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-> не пашет)?


Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #14 : Март 20, 2018, 17:25 »

Цитировать
как сослаться на grid
Код
C++ (Qt)
widget->layout();
 
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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