Архив метки: qt

Проигрываем mp3 из ресурсов в QT4 и QT5

При переходе из QT4 на QT5 была сломана обратная совместимость при проигрывании звука — был убран модуль phonon, вместо него предлагается модуль multimedia. Для того чтобы код работал и «там и там», можно воспользоваться следующим вариантом.

*.pro:

QT+= core \
    gui \
    network \
    widgets 
lessThan (QT_MAJOR_VERSION, 5): QT += phonon
greaterThan (QT_MAJOR_VERSION, 5): QT += multimedia multimediawidgets

*.h:

...
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
 #include <Phonon/MediaObject>
 #include <Phonon/AudioOutput>
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    #include <QMediaPlayer>
    #include <QDir>
    #include <QUrl>
#endif
...

*.cpp:

....
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
        qDebug() << "Через Phonon";
        Phonon::MediaObject *music =
        Phonon::createPlayer(Phonon::MusicCategory,Phonon::MediaSource(QUrl("qrc:/sounds/Sound_21009.mp3")));
         music->play();
#endif
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
         qDebug() << "Через QMediaPlayer";
         QMediaPlayer *player = new QMediaPlayer;
         player->setMedia(QUrl("qrc:/sounds/Sound_21009.mp3"));
         player->setVolume(100);
         player->play();
#endif
...

Получите 52мб файлов для простой программы на QT

И вот настал час Х — после разработки приложения в QT Creator вы готовы попробовать запустить исполняемый файл на другом компьютере. Да или просто запустить файл вне QT Creator. И получите ОЙ. Ибо приложение тащит за собой кучу DLL библиотек. Какие именно нужны библиотеки, можно выяснить при помощи инструмента windeployqt.exe, которая поставляется вместе с QT Creator.

Запустив его так:

windeployqt.exe c:\sbssalert\sbssalert.exe

программа скопирует в папку приложения, все необходимые для работы DLL библиотеки. У меня их оказалось 52мб.

Есть конечно способ собрать всё в один exe файл, но для этого требуется очень много телодвижений — нужно из исходников QT Cretator перекомпилировать сам QT Creator . У меня это не получилось.

Эх…

Воспроизведение mp3 из ресурса QT

Сначала необходимо добавить ресурс (правая кнопка мыши по проекту -> QT -> добавить ресурс):

Далее воспроизводим:

#include <Phonon/MediaObject>

void Form1::SoundPlay(){

    Phonon::MediaObject *music =
    Phonon::createPlayer(Phonon::MusicCategory,
                              Phonon::MediaSource(QUrl("qrc:/sounds/01009.mp3")));
     music->play();
}

 

QT Creator : Скачать файл по URL

form1.h:

...
private slots:
           void onResultJson();

private:
    Ui::Form1 *ui;
    QNetworkAccessManager *networkManager;
...

form1.cpp:

...
    networkManager = new QNetworkAccessManager();
    QNetworkReply* mNetReply = nullptr;
    // Получаем данные, а именно JSON файл с сайта по определённому url
    mNetReply=networkManager->get(QNetworkRequest(QUrl("http://xn--90acbu5aj5f.xn--p1ai/files/json")));
    // Подключаем networkManager к обработчику ответа
    connect(mNetReply,SIGNAL(finished()), this, SLOT(onResultJson()));
...

void Form1::onResultJson(){
    qDebug() << "Файл скачали";
    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
    if (reply->error() == QNetworkReply::NoError)
        {
         QByteArray content= reply->readAll();
         qDebug() << content;
....

QT Creator : работа с QtableWidget

Form1::Form1(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Form1){
    ui->setupUi(this);
   ui->tableWidget->setColumnCount(2); // Указываем число колонок
    ui->tableWidget->setShowGrid(true); // Включаем сетку
    // Разрешаем выделение только одного элемента
    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    // Разрешаем выделение построчно
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    // Устанавливаем заголовки колонок
    QStringList headers;
        headers.append("Название");
        headers.append("Количество");
    ui->tableWidget->setHorizontalHeaderLabels(headers);
    // Растягиваем последнюю колонку на всё доступное пространство
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
    // Скрываем колонку под номером 0
    //ui->tableWidget->hideColumn(0);
    // делаем таблицу readonly
    ui->tableWidget->setEditTriggers(QTableWidget::NoEditTriggers);
    // добавим в ячейки данные
    ui->tableWidget->insertRow(0);
    ui->tableWidget->setItem(0,0, new QTableWidgetItem("Ваши новые тикеты"));
    ui->tableWidget->setItem(0,1, new QTableWidgetItem("0"));
    ui->tableWidget->insertRow(1);
    ui->tableWidget->setItem(1,0, new QTableWidgetItem("-- не завершенные (Менеджер)"));
    ui->tableWidget->setItem(1,1, new QTableWidgetItem("0"));
    ui->tableWidget->insertRow(2);
    ui->tableWidget->setItem(2,0, new QTableWidgetItem("-- не завершенные (Клиент)"));
    ui->tableWidget->setItem(2,1, new QTableWidgetItem("0"));
    ui->tableWidget->insertRow(3);
    ui->tableWidget->setItem(3,0, new QTableWidgetItem("Новых в подразделении"));
    ui->tableWidget->setItem(3,1, new QTableWidgetItem("0"));
    ui->tableWidget->insertRow(4);
    ui->tableWidget->setItem(4,0, new QTableWidgetItem("-- не закрытых"));
    ui->tableWidget->setItem(4,1, new QTableWidgetItem("0"));
    ui->tableWidget->insertRow(5);
    ui->tableWidget->setItem(5,0, new QTableWidgetItem("Заявок на подключения"));
    ui->tableWidget->setItem(5,1, new QTableWidgetItem("0"));
    // растянем все колонки
    ui->tableWidget->resizeColumnsToContents();