БлогNot. FAQ по Qt6: короткие вопросы и ответы

FAQ по Qt6: короткие вопросы и ответы

Сейчас в статье: 17 ответов Здесь собраны небольшие фрагменты кода на Qt/C++, отвечающие на вопросы, которые возникали у людей в процессе изучения шестой версии subj, коды проверялись в ней из проекта типа "Приложение Qt Widgets", хотя последнее не принципиально.

Предполагается знакомство с языком С++ и, по крайней мере, одной современной IDE, такой как Visual Studio.

Надеюсь, статья будет иногда пополняться.

1. Как перевести QString в char * или std::string и обратно?
QString str = "Тестовая строка";
char *ptr = str.toUtf8().data();
qDebug() << ptr; //#include <QtCore>

QString str2("Другая строка");
std::string s = str2.toStdString();
qDebug() << s.c_str();
2. Как перевести строку QString в число и обратно?
QString str = "1234.56";
double f = str.toDouble();
int d = qFloor(str.toDouble()); //#include <QtMath>
qDebug() << f << " " << d; //#include <QtCore>

QString str2 = QString::number(f);
qDebug() << str2;
3. Как вывести окно с сообщением и кнопкой "ОК"?
#include <QMessageBox>
//...
QMessageBox::about(this,QString("Заголовок"),QString("Содержимое"));
4. Как узнать пути к папке/файлу приложения?
QString path =
 tr("Папка программы: ") + QApplication::applicationDirPath() + "\n" +
 tr("Путь к файлу: ") + QApplication::applicationFilePath();
QMessageBox::about(this,"Пути",path); //#include <QMessageBox>
5. Как разобрать на части путь к файлу?
QFileInfo info("c:\\Windows\\System32\\notepad.exe"); //#include <QFileInfo>
QStringList list; //#include <QStringList>
list.append(info.absoluteFilePath());
list.append(info.absolutePath());
list.append(info.fileName());
list.append(info.baseName());
list.append(info.suffix());
QString path = list.join("\n");
QMessageBox::about(this,"Разбор пути",path); //#include <QMessageBox>
6. Как программно создать папку, если её нету?
QString folder = "d:\\Prog\\Temp";
if (!QDir(folder).exists())  //#include <QDir>
 QDir().mkdir(folder);
7. Как запустить внешнюю программу?
QProcess proc; //#include <QProcess>
QStringList param; //#include <QStringList>
param << "C:\\Windows\\System32\\drivers\\etc\\hosts";
proc.start("notepad.exe",param);
proc.waitForFinished();
8. Как скопировать текст в буфер обмена?
QClipboard *cb = QApplication::clipboard(); //#include <QClipboard>
QString text("Текст для буфера обмена");
cb->setText(text)
9. Как теперь в шестой версии работать с кириллицей в консоли, рецепты из сети не работают?

Ответы см. в этой статье.

10. QRegExp из скачанного проекта не работает, что делать?

Ответы есть здесь.

11. Окно виджета не позиционируется по центру экрана кодом вида
//файл widget.cpp
Widget::Widget(QApplication *a,QWidget *parent) : QWidget(parent) {
 //...
 this->setGeometry(
  QStyle::alignedRect(Qt::LeftToRight,Qt::AlignCenter,this->size(),
   a->desktop()->availableGeometry())
 );
 //...
}

//файл main.cpp
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[]) {
 QApplication a(argc, argv);
 Widget w(&a);
 //...
} 

Устарело. Актуальный код имеет вид

 this->setGeometry(
  QStyle::alignedRect(Qt::LeftToRight,Qt::AlignCenter,this->size(),
   a->screens().first()->geometry())
 ); 
12. Не могу установить внешние отступы для контейнера QGridLayout и подобных, например:
QGridLayout *myLayout = new QGridLayout;
myLayout->setMargin(5);

Устарело. Верно

myLayout->setContentsMargins(5,5,5,5);
13. Перестали работать все QtAlgorithms!

Почти всё устарело. По ссылке рекомендуют использовать соответствующие алгоритмы STL из пространства имён std. Например, для копирования элементов из одного массива в другой можно задействовать алгоритм std::copy() вместо xCopy:

QString values[] = {"Xandria", "Therion", "Nightwish", "Haggard"};  
const int n = sizeof(values) / sizeof(QString);  
QString copyOfValues[n];  
std::copy (values, values + n, copyOfValues);  
for (int i = 0; i < n; i++) qDebug() << copyOfValues[i];
14. Консольное приложение выводит информацию в нижнюю панель "Вывод приложения" вместо отдельного окна консоли.

Переключать режим вывода консольного приложения между нижней панелью "Вывод приложения" и отдельным окном терминала можно с помощью опции Проекты (горячая клавиша Ctrl+5) - Запуск - Запускать в терминале.

15. Как сделать собственную консоль для вывода через qDebug()?

См. здесь проект "QTextEditConsole.zip".

16. Как сделать разные цвета кнопки при наведении курсора мыши и нажатии?

Например, установить из конструктора виджета нужный стиль для кнопки pushButton, созданной в режиме дизайна:

ui->setupUi(this);
//...
ui->pushButton->setStyleSheet(
 "QPushButton{background-color: white;}"
 "QPushButton:hover{background-color: blue;}"
 "QPushButton:pressed{background-color: red;}");
17. Как в Qt определить текущую дату ДД.ММ.ГГГГ и номер недели в году по ISO?
#include <QDateTime>
#include <QDate>
#include <QMessageBox>
//...
 QDate date = QDateTime::currentDateTime().date();
 QString str;
 str.sprintf("%02d.%02d.%04d: %02d", date.day(), date.month(), date.year(),
  date.weekNumber());
 QMessageBox::information(this,"Weeknumber", str);

07.10.2023, 12:00 [279 просмотров]


теги: учебное список программирование c++ qt

показать комментарии (2)