Harrix Блог

  • Списки статей
    • Все статьи
    • IT
    • Qt
    • C++
    • Сложение двух чисел
    • Web программированиe
    • FAQ
    • Latex
    • Установка программ
    • Мифы
    • Видео
    • Про фото
  • Проекты
  • Harrix.org
  • RSS
  • Контакты

FAQ по Qt

Здесь будут публиковаться бессистемные моменты по Qt, которые могут пригодиться Вам, а я смогу не забыть их.

24.07.2013 7 комментариев 44 098 просмотров

Здесь будут публиковаться бессистемные моменты по Qt, которые могут пригодиться Вам, а я смогу не забыть их.

Содержание

  • Статьи на сайте
  • Как написать русский текст, чтобы он отображался в Label и др?
  • Как добавить текст в textEdit?
  • Как считать значение с lineEdit?
  • Как перевести строку в число?
  • Как перевести число в строку?
  • Как сделать иконку для exe файла?
  • Как развернуть приложение Qt Quick 2.0 во весь экран?
  • Как сослаться на элемент в папке с программой в QtQuick 2.0?
  • Как сослаться на элемент из ресурса в QtQuick 2.0?
  • Как загрузить текстовой файл в QString?
  • Как сохранить QString в текстовой файл?
  • Как получить путь к папке, в которой находится приложение?
  • Как открыть произвольный файл на компьютере через Qt?
  • Как считать список всех файлов в директории?
  • Как считать список всех директорий (папок) в директории?
  • Как сделать так, чтобы при большом цикле в Qt приложение не застывало?
  • Как получить расширение файла по его имени?
  • Как перевести QString в QStringList?
  • Как перевести QStringList в QString?
  • Как добавить в ListView элементы списка?
  • Как получить текст выделенного элемента в ListView?
  • Как проверить QString на то, что строка пустая?
  • Как создать папку?
  • Как скопировать файл?
  • Какой аналог alAlign и TPanel в Qt?
  • Как поставить режим readonly для textEdit?
  • Как поставить режим readonly для listView?
  • Как скопировать файл?
  • Как исправить ошибку при компиляции при добавлении webView на форму?
  • Как открыть локальный html файл через QWebView?
  • Как в textEdit переместиться к последней добавленной строке?
  • Как узнать длину строки QString?
  • Как узнать число вхождений подстроки в QString?
  • Как узнать время работы функции?
  • Как вызвать диалог открытия файла?
  • Как сделать так, чтобы элементы растягивались под размер окна в Gui Application?
  • Как заменить все вхождения подстроки на другую подстроки в QString?
  • Как заменить только первое вхождение подстроки на другую подстроки в QString?
  • Как в Qt Creator продублировать текущую строку?
  • Как установить Qt?
  • Как подключиться к базе данных в Microsoft SQL Server 2012 в Qt
  • Как вывести данные в tableView в Qt
  • Как сделать tableView только для чтения (ReadOnly)
  • Как сохранить данные из QTextEdit в ODF
  • Как сохранять из QTableView данные в CSV формат
  • Как проиграть mp3 файл?
  • Как рисовать графики в Qt
  • Как сделать приложение, которое бы не разворачивалось?
  • Как добавить в Qt Creator вертикальную линию, показывающую рекомендательную длину строк?
  • Как вывести QMessageBox и узнать его результат?
  • Как перевести строку в дату?
  • Как в statusBar записать сообщение?

Статьи на сайте

Далеко не весь материал по Qt попадает в эту статью. Посмотрите какие еще есть статьи на тему Qt на моём сайте:

http://blog.harrix.org/?page_id=791#h2_3

Как написать русский текст, чтобы он отображался в Label и др?

Если не возиться с универсальностью программы и возможностью перевода на другие языки, то так:

1
ui->label->setText(QString::fromLocal8Bit("Русский текст"));

Как добавить текст в textEdit?

1
2
3
QString A="Your string";
 
ui->textEdit->insertPlainText(A+"\n");

Как считать значение с lineEdit?

1
2
QString A;
A=ui->lineEdit->text();

Как перевести строку в число?

1
2
3
4
5
6
7
QString A="3.14";
 
int x;
x=A.toInt();//в целое число
 
double y;
y=A.toDouble();//в число с плавающей запятой

Как перевести число в строку?

1
2
3
4
int x=3;
QString A;
 
A=QString::number(x);

Как сделать иконку для exe файла?

Update.

Теперь можно сделать проще. Добавляем иконку с именем, например, myappico.ico в папку с проектом расширения .pro.

И просто допишите в файле проекта .pro:

1
RC_ICONS = myappico.ico

Старый вариант

Добавляем иконку с именем, например, myappico.ico в папку с проектом расширения .pro.

Создаем в этой же папке тестовой файл myapp.rc с текстом:

1
IDI_ICON1               ICON    DISCARDABLE     "myappico.ico"

Открываем файл проекта расширения .pro и в часом конце добавляем:

1
win32:RC_FILE = myapp.rc

Перестраиваете проект и иконка появляется.

Как развернуть приложение Qt Quick 2.0 во весь экран?

В файле main.cpp строчку:

1
viewer.showExpanded();

Заменяем на

1
viewer.showFullScreen();

Как сослаться на элемент в папке с программой в QtQuick 2.0?

Через путь file://, например, вот так:

1
2
3
   Video {
         source: "file://video01.wmv"
    }

Как сослаться на элемент из ресурса в QtQuick 2.0?

Через путь qrc:/, например, вот так:

1
2
3
    Image {
        source: "qrc:/images/images/bk.png"
    }

Как загрузить текстовой файл в QString?

Подключите заголовочные файлы:

1
2
#include <QDebug>
#include <QFile>

Можно воспользоваться любой из двоих функций:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
QString readfile(QString filename)
{
    /*
    Функция считывает текстовой файл в QString.
    Входные параметры:
     filename - имя файла.
    Возвращаемое значение:
     Строка со всем содержимым текстового файла.
    */
    QFile file(filename);
    QString line="";
    if(!file.exists()){
        qDebug() << "Не существует "<<filename;
    }else{
        qDebug() << filename<<" загружается...";
    }
    if(file.open(QIODevice::ReadOnly|QIODevice::Text))
        line=file.readAll();
    file.close();
    return line;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
QString readfile2(QString filename)
{
    /*
    Функция считывает текстовой файл в QString. Загружает построчно.
    Входные параметры:
     filename - имя файла.
    Возвращаемое значение:
     Строка со всем содержимым текстового файла.
    */
    QFile file(filename);
    QString line="";
    if(!file.exists()){
        qDebug() << "Не существует "<<filename;
    }else{
        qDebug() << filename<<" загружается...";
    }
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QTextStream stream(&file);
        while (!stream.atEnd()){
           line+=stream.readLine()+"\n";
        }
    }
    file.close();
    return line;
}

Например, так:

1
2
QString line;
line = readfile("test.txt");

Как сохранить QString в текстовой файл?

Подключите заголовочный файл:

1
#include <QFile>

И используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void savefile(QString line, QString filename)
{
    /*
    Функция сохраняет QString в текстовой файл.
    Входные параметры:
     line - содержимое, которое нужно сохранить;
     filename - имя файла.
    Возвращаемое значение:
     Отсутствует.
    */
    QFile file(filename);
    if(file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QTextStream stream(&file);
        stream << line;
    }
    file.close();
}

Например, так:

1
2
QString line="123";
savefile(line,"test2.txt");

Как получить путь к папке, в которой находится приложение?

1
QString path=QGuiApplication::applicationDirPath();

Как открыть произвольный файл на компьютере через Qt?

Подключите:

1
2
#include <QDesktopServices>
#include <QUrl>

1
QDesktopServices::openUrl(QUrl::fromLocalFile(path));

Например,

1
2
QString path=QGuiApplication::applicationDirPath()+"/test.txt";
QDesktopServices::openUrl(QUrl::fromLocalFile(path));

Как считать список всех файлов в директории?

Подключите заголовочный файл:

1
#include <QDir>

И используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
QString listfilesindir(QString path)
{
    /*
    Функция считывает список файлов (включая скрытые) в директории в QString.
    Входные параметры:
     path - путь к папке.
    Возвращаемое значение:
     Строка со списком файлов в директории, разделенные n в алфавитном порядке.
    */
    QString line="";
    QDir dir(path);
    bool ok = dir.exists();
    if (ok)
    {
        dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
        dir.setSorting(QDir::Name);
        QFileInfoList list = dir.entryInfoList();
 
        for (int i = 0; i < list.size(); ++i)
        {
            QFileInfo fileInfo = list.at(i);
            line+=fileInfo.fileName()+"\n";
        }
    }
    return line;
}

Как считать список всех директорий (папок) в директории?

Подключите заголовочный файл:

1
#include <QDir>

И используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
QString listdirsindir(QString path)
{
    /*
    Функция считывает список директорий в директории в QString.
    Входные параметры:
     path - путь к папке.
    Возвращаемое значение:
     Строка со списком директорий в директории, разделенные n в алфавитном порядке.
    */
    QString line="";
    QDir dir(path);
    bool ok = dir.exists();
    if (ok)
    {
        dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs );
        dir.setSorting(QDir::Name);
        QFileInfoList list = dir.entryInfoList();
 
        for (int i = 0; i < list.size(); ++i)
        {
            QFileInfo fileInfo = list.at(i);
            line+=fileInfo.fileName()+"\n";
        }
    }
    return line;
}

Как сделать так, чтобы при большом цикле в Qt приложение не застывало?

Аналог Application->ProcessMessages в С++ Builder или ::Application::DoEvents() в Visual Studio в Qt есть:

1
QGuiApplication::processEvents();

Например:

1
2
3
4
5
6
7
8
9
10
11
    int s=0;
    for (int i=0;i<1000;i++)
    {
        for (int j=0;j<1000;j++)
        {
            QString A="Example";
            s++;
 
            QGuiApplication::processEvents();
        }
    }

Но разумеется, что лучше использовать потоки для этого.

Как получить расширение файла по его имени?

Используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
QString HQt_GetExpFromFilename(QString filename)
{
    /*
    Функция получает расширение файла по его имени.
    Входные параметры:
     filename - имя файла.
    Возвращаемое значение:
     Строка значением расширения файла в нижнем регистре.
    */
    QString exp="";
    exp=filename.mid(filename.lastIndexOf(".")+1);
    exp=exp.toLower();
    return exp;
}

Например, можно использовать так:

1
2
3
QString A="test.txt";
Qstring B=HQt_GetExpFromFilename(A);
//B=="txt"

Как перевести QString в QStringList?

Используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
QStringList HQt_QStringToQStringList(QString line)
{
    /*
    Функция переводит QString в QStringList.
    Входные параметры:
     line - строка.
    Возвращаемое значение:
     Список строк.
    */
    QStringList lines = line.split( "\n", QString::SkipEmptyParts );
 
    return lines;
}

Как перевести QStringList в QString?

Используйте функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
QString HQt_QStringListToQString(QStringList lines)
{
    /*
    Функция переводит QStringList в QString.
    Входные параметры:
     lines - список строк.
    Возвращаемое значение:
     Строка с разделениями n.
    */
    QString line = lines.join('\n');
 
    return line;
}

Как добавить в ListView элементы списка?

Пример кода показан ниже:

1
2
3
4
5
6
7
8
9
10
11
12
13
    QStandardItemModel *model = new QStandardItemModel;//новая модель списка
    QStandardItem *item;//элемент списка
 
    //добавление нового элемента
    item = new QStandardItem(QString("TEST 1"));
    model->appendRow(item);
 
    //добавление нового элемента
    item = new QStandardItem(QString("TEST 2"));
    model->appendRow(item);
 
    //соединение модели списка с конкретным списком
    ui->listView->setModel(model);

Как получить текст выделенного элемента в ListView?

Если нужно узнать текст в произвольном месте программы, то используйте следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    QString Result;//Итоговый результат
 
    QModelIndexList selectedIndexes = ui->listView->selectionModel()->selectedIndexes();
    QStringList selectedTexts;//в теории может быть несколько выделенных пунктов списка
 
    //пробегаем по всем элементам списка
    foreach(const QModelIndex &idx, selectedIndexes)
    {
        selectedTexts << idx.data(Qt::DisplayRole).toString();//выдергиваем наименования значений списка
    }
 
    Result=selectedTexts.join(',');//соединяем все найденные элементы
 
    //используем результат
    ui->textEdit->insertPlainText(Result);

Если текст нужно узнать из функции клика по самому компоненту ListView on_listView_clicked, то вот пример нужного кода:

1
2
3
4
5
6
7
8
9
10
void MainWindow::on_listView_clicked(const QModelIndex &index)
{
    QString Result;//Итоговый результат
 
    //выдергиваем текст
    Result=index.data(Qt::DisplayRole).toString();
 
    //используем результат
    ui->textEdit->insertPlainText(Result);
}

Как проверить QString на то, что строка пустая?

Вот код:

1
2
3
4
if (Temp.trimmed().isEmpty())
{
//строка пустая
}

Если вы допускаете, что строка может содержать пробелы и так далее, то используйте код:

1
2
3
4
if (Temp.isEmpty())
{
//строка пустая
}

Как создать папку?

Вот код для создания папки:

1
2
3
4
if (!(QDir(path).exists()==true) )
    {
        QDir().mkdir(path);
    }

Как скопировать файл?

Используйте следующую функцию:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool HQt_CopyFile(QString filename, QString dir)
{
    /*
    Функция копирует файл filename в папку dir.
    Входные параметры:
     filename - имя файла (с полным путем),
     dir - путь к папке, куда нужно скопировать файл.
    Возвращаемое значение:
     true - если скопировалось удачно,
     false - если скопировалось неудачно.
    */
    QFileInfo fileInfo(filename);
    QString destinationFile = dir + QDir::separator() + fileInfo.fileName();
    bool result = QFile::copy(filename, destinationFile);
    return result;
}

Какой аналог alAlign и TPanel в Qt?

Читайте тут: http://blog.harrix.org/?p=765.

Как поставить режим readonly для textEdit?

Пропишите:

1
ui->textEdit->setReadOnly(true);

Например, в функции:

1
2
3
4
5
6
7
8
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    ui->textEdit->setReadOnly(true);
}

Как поставить режим readonly для listView?

Пропишите:

1
ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);

Например, в функции:

1
2
3
4
5
6
7
8
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    ui->listView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Как скопировать файл?

Вам что-то из этого нужно будет подключить:

1
2
3
#include <QFile>
#include <QUrl>
#include <QDir>

Воспользуйтесь функцией:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
bool HQt_CopyFile(QString filename, QString dir, bool overwrite)
{
    /*
    Функция копирует файл filename в папку dir, с возможносью перезаписи.
    Входные параметры:
     filename - имя файла (с полным путем),
     dir - путь к папке, куда нужно скопировать файл.
     overwrite - если true, то перезаписывать, если false, то не перезаписывать
    Возвращаемое значение:
     true - если скопировалось удачно,
     false - если скопировалось неудачно.
    */
    QFileInfo fileInfo(filename);
    QString destinationFile = dir + QDir::separator() + fileInfo.fileName();
 
    if ((QFile::exists(destinationFile))&&(overwrite==true))
    {
        QFile::remove(destinationFile);
    }
 
    bool result = QFile::copy(filename, destinationFile);
    return result;
}

Как исправить ошибку при компиляции при добавлении webView на форму?

При добавлении webView на форму возникает ошибка при компиляции:

1
error: undefined reference to `_imp___ZN8QWebViewC1EP7QWidget'

Откройте файл проекта .pro и строчку:

1
QT       += core gui

замените на строчку:

1
QT       += core gui webkitwidgets

Как открыть локальный html файл через QWebView?

Воспользуйтесь строчкой:

1
ui->webView->setUrl(QUrl::fromLocalFile(path));

path – переменная типа QString. Для открытия файла index.html, находящийся в папке с программой воспользуйтесь кодом:

1
QString path=QGuiApplication::applicationDirPath()+QDir::separator()+"index.html";

Как в textEdit переместиться к последней добавленной строке?

Например, это надо при добавлении новых строк, которые не влезают в окно textEdit. Воспользуйтесь кодом:

1
2
3
        QTextCursor c =  ui->textEdit->textCursor();
        c.movePosition(QTextCursor::End);
        ui->textEdit->setTextCursor(c);

Как узнать длину строки QString?

Вот код с функцией:

1
2
3
    QString A="Simipl;d n;fr;";
 
    int s=A.count();

Как узнать число вхождений подстроки в QString?

Вот код с функцией:

1
2
3
    QString A="Simipl;d n;fr;";
 
    int s=A.count(";");//s==3

Как узнать время работы функции?

1
2
3
4
QTime myTimer;
myTimer.start();
// do something..
int nMilliseconds = myTimer.elapsed();

Как вызвать диалог открытия файла?

Для начала подключите модуль:

1
#include <QFileDialog>

А потом в месте, где вызывается диалог, напишите:

1
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"",tr("Files (*.*)"));//где пропуск - там путь

Как сделать так, чтобы элементы растягивались под размер окна в Gui Application?

Об этом читайте в статье Аналог Align alClient в Qt Gui Application.

Как заменить все вхождения подстроки на другую подстроки в QString?

Пример ниже приведен:

1
2
3
QString VHML_Result="54128961234";
 
VHML_Result=VHML_Result.replace("1","2");

Как заменить только первое вхождение подстроки на другую подстроки в QString?

Пример ниже приведен:

1
2
3
4
5
QString str("this is a string"); // The initial string.
QString subStr("is"); // String to replace.
QString newStr("at"); // Replacement string.
 
str.replace(str.indexOf(subStr), subStr.size(), newStr);

Как в Qt Creator продублировать текущую строку?

Для этого используется сочетания Ctrl + Alt + Down. Кстати, в Notepad++ аналогичное действие делает сочетание: Ctrl + D.

Как установить Qt?

Смотрите статью http://blog.harrix.org/?p=917.

Как подключиться к базе данных в Microsoft SQL Server 2012 в Qt

Смотрите в статье.

Как вывести данные в tableView в Qt

Смотрите в статье.

Как сделать tableView только для чтения (ReadOnly)

Используйте в самом начале программы (например в конструкторе формы) такой вызов:

1
ui->tableView->setEditTriggers(QTableWidget::NoEditTriggers);

Как сохранить данные из QTextEdit в ODF

Читать статью.

Как сохранять из QTableView данные в CSV формат

Читать статью.

Как проиграть mp3 файл?

Прочитать можно в статье.

Как рисовать графики в Qt

Читать статью тут.

Как сделать приложение, которое бы не разворачивалось?

В main.cpp перед строчкой w.show(); пишем строчки:

1
2
w.setWindowFlags(Qt::Dialog);
w.setFixedSize(QSize(466, 485));

Вместо чисел ставите свои размеры окна.

Как добавить в Qt Creator вертикальную линию, показывающую рекомендательную длину строк?

Идите в настройки Tools → Options:

2015-12-18_084842

2015-12-18_084947

Как вывести QMessageBox и узнать его результат?

1
2
3
4
5
6
7
8
9
QMessageBox::StandardButton reply;
  reply = QMessageBox::question(this, "Test", "Quit?",
                                QMessageBox::Yes|QMessageBox::No);
  if (reply == QMessageBox::Yes) {
    qDebug() << "Yes was clicked";
    QApplication::quit();
  } else {
    qDebug() << "Yes was *not* clicked";
  }

Как перевести строку в дату?

1
QDate currDate(QDate::fromString("20090512", "yyyyMMdd"));

Как в statusBar записать сообщение?

1
statusBar->showMessage(tr("Ready"));


Статьи по теме:

  1. Как сохранить данные из QTextEdit в ODF
  2. Распространенные ошибки в Qt у начинающих
  3. Сложение двух чисел в Qt 5.6.0 на C++ (Qt Quick)
  4. Сложение двух чисел в Qt 5.7.0 на C++ (Qt Quick Controls 2)

IT C++, FAQ, Qt

© 2014 Harrix