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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание меню[Решено]  (Прочитано 3599 раз)
Trademaster
Гость
« : Август 26, 2013, 23:08 »

Ребята ,хочу создать менюшку. Смотрите ,есть база данных ,в ней в каждом строке есть 2 столбца ,1 строка - это путь к  иконке программы , 2 - это путь   к екзешнику программы. Основная программа (по сути просто меню) берет все иконки из базы данных и выводит их на экран. Цель : что бы при нажатии на иконку запускался екзешник ,который этот иконке соответствует . Реализация мне не ясна ,может вы поможете?
« Последнее редактирование: Август 27, 2013, 08:11 от Trademaster » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Август 27, 2013, 00:00 »

Создать QListWidget, поменять его ViewMode на QListView::IconMode
После заполняете QListWidget

Цитировать
Цель : что бы при нажатии на иконку запускался екзешник ,который этот иконке соответствует
Обрабатываете нужный сигнал QListWidget'a, например clicked(), подключая его к слоту, который и запустит выбранную прогу Улыбающийся
Прогу запускаете через QProcess


Если именно меню, тогда выбираем QMenu Улыбающийся
« Последнее редактирование: Август 27, 2013, 00:05 от gil9red » Записан

Trademaster
Гость
« Ответ #2 : Август 27, 2013, 01:06 »

описанное уже реализовано ,почти. Не знаю как подключить иконку к тому ,что запустит соответствующую ей прогу. Вот исходники:
Код:
#include "widget.h"
#include <QDir>
#include <QString>
#include <QDebug>
#include <QGridLayout>


void calcRows();

int dir = 0;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    sdb = QSqlDatabase::addDatabase("QSQLITE");
    sdb.setDatabaseName("D:/Programming/release/FuOrgProjectFirstRelease/myDB.sqlite");
    sdb.open();
    QSqlQuery a_query;
    if(sdb.isOpen())
    {
        qDebug() << "Yeah";
    }
    else {
        qDebug() << "noob";
           qDebug() << sdb.lastError().text();
    }
    QString str = "SELECT * FROM FuOrg";
    a_query.exec(str);
    QSqlRecord rec = a_query.record();
    QString addressIcon;
    QString addressExe;
    int i = 0;
    while(a_query.next())
    {
       i++;
    }
    QString exeFile[i];
    QString icoFile[i];
    int numeric=0;
    qDebug() << i;
    a_query.first();
    a_query.previous();
    while(a_query.next())
    {
        exeFile[numeric] = a_query.value(rec.indexOf("addressExe")).toString();
        icoFile[numeric] = a_query.value(rec.indexOf("addressIcon")).toString();
        numeric++;
    }
    numeric=0;





    testWidgetList = new QListWidget();
    testWidgetList->setViewMode(QListView::IconMode);
    testWidgetList->setResizeMode(QListView::Adjust);
    testWidgetList->setDragEnabled(false);
    while (numeric < i)
    {
        testItemWidget = new QListWidgetItem(QIcon(icoFile[numeric])
                                             , QString(""), testWidgetList);
        testWidgetList->addItem(testItemWidget);
        testItemWidget->setData(numeric,"");
        numeric++;
    }
    QGridLayout *testlay = new QGridLayout;
    testlay->addWidget(testWidgetList);
    setLayout(testlay);
    setWindowTitle(tr("Fuorg"));
}

Widget::~Widget()
{
   
}
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Август 27, 2013, 07:12 »

// widget.h
Код:
...
private slots:
    void itemDoubleClicked(QListWidgetItem *item);

// widget.cpp
Код:
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    sdb = QSqlDatabase::addDatabase("QSQLITE");
    sdb.setDatabaseName("D:/Programming/release/FuOrgProjectFirstRelease/myDB.sqlite");
    sdb.open();
    QSqlQuery a_query;
    if(sdb.isOpen())
    {
        qDebug() << "Yeah";
    }
    else {
        qDebug() << "noob";
           qDebug() << sdb.lastError().text();
    }
    QString str = "SELECT * FROM FuOrg";
    a_query.exec(str);
    QSqlRecord rec = a_query.record();

    testWidgetList = new QListWidget();
    testWidgetList->setViewMode(QListView::IconMode);
    testWidgetList->setResizeMode(QListView::Adjust);
    testWidgetList->setDragEnabled(false);

// заполняем QListWidget
    while(a_query.next())
    {
        QString addressExe = a_query.value(rec.indexOf("addressExe")).toString();
        QString addressIcon = a_query.value(rec.indexOf("addressIcon")).toString();

        QListWidgetItem *newItem = new QListWidgetItem(QIcon(addressIcon), QString(""));
        newItem->setData(32, addressExe); // сохраняем путь к ехе   

        testWidgetList->addItem(newItem);             
    }

// подключаем сигнал
    connect(testWidgetList, SIGNAL(itemDoubleClicked(QListWidgetItem*)), SLOT(itemDoubleClicked(QListWidgetItem)));

    QGridLayout *testlay = new QGridLayout;
    testlay->addWidget(testWidgetList);
    setLayout(testlay);
    setWindowTitle(tr("Fuorg"));
}

void Widget::itemDoubleClicked(QListWidgetItem *item)
{
     QString pathExe = item.data(32).toString(); // получаем путь к ехе   
     QProcess::startDetached(pathExe);
}
Записан

Trademaster
Гость
« Ответ #4 : Август 27, 2013, 08:03 »

Система мне понятна. Спасибо за помощь.
P.S Ошибки в коде: connect(testWidgetList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(itemDoubleClicked(QListWidgetItem))); // в конце к QlistWidgetItem нужно добавить * ,иначе ошибка.
 QString pathExe = item.data(32).toString(); // нужно юзать item->data(32)
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Август 27, 2013, 08:08 »

Я ж писал код тут же, вот и мог где-то недоглядеть, где-то ошибиться Улыбающийся
Записан

Trademaster
Гость
« Ответ #6 : Август 27, 2013, 08:11 »

да к тебе притензий ноль ,я просто малоли кому-то будет нужно ,вот сразу описал проблемы Улыбающийся)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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