Russian Qt Forum

Qt => Общие вопросы => Тема начата: Trademaster от Август 26, 2013, 23:08



Название: Создание меню[Решено]
Отправлено: Trademaster от Август 26, 2013, 23:08
Ребята ,хочу создать менюшку. Смотрите ,есть база данных ,в ней в каждом строке есть 2 столбца ,1 строка - это путь к  иконке программы , 2 - это путь   к екзешнику программы. Основная программа (по сути просто меню) берет все иконки из базы данных и выводит их на экран. Цель : что бы при нажатии на иконку запускался екзешник ,который этот иконке соответствует . Реализация мне не ясна ,может вы поможете?


Название: Re: Создание меню
Отправлено: gil9red от Август 27, 2013, 00:00
Создать QListWidget, поменять его ViewMode на QListView::IconMode
После заполняете QListWidget

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


Если именно меню, тогда выбираем QMenu :)


Название: Re: Создание меню
Отправлено: Trademaster от Август 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()
{
   
}


Название: Re: Создание меню
Отправлено: gil9red от Август 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);
}


Название: Re: Создание меню
Отправлено: Trademaster от Август 27, 2013, 08:03
Система мне понятна. Спасибо за помощь.
P.S Ошибки в коде: connect(testWidgetList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(itemDoubleClicked(QListWidgetItem))); // в конце к QlistWidgetItem нужно добавить * ,иначе ошибка.
 QString pathExe = item.data(32).toString(); // нужно юзать item->data(32)


Название: Re: Создание меню
Отправлено: gil9red от Август 27, 2013, 08:08
Я ж писал код тут же, вот и мог где-то недоглядеть, где-то ошибиться :)


Название: Re: Создание меню
Отправлено: Trademaster от Август 27, 2013, 08:11
да к тебе притензий ноль ,я просто малоли кому-то будет нужно ,вот сразу описал проблемы :))