Шпаргалка полезных команд gdb

Установка и снятие отметки для потока

Вы можете помечать требующие внимания потоки, чтобы следить за ними.

Устанавливайте и снимайте метки потоков в редакторе исходного кода или в окне Потоки. Выберите, следует ли отображать только помеченные потоки или все потоки, в окне Место отладки или Потоки. Выбор, сделанный из любого расположения, влияет на все расположения.

Установка и снятие метки для потоков в исходном коде

Чтобы открыть панель инструментов Место отладки, выберите Вид > Панели инструментов > Место отладки. Можно также щелкнуть правой кнопкой мыши в области панели инструментов и выбрать Место отладки.

Панель инструментов Место отладки содержит три поля: Процесс, Поток и Кадр стека

Откройте раскрывающийся список Поток и обратите внимание на количество потоков. В списке Поток выполняющийся в данный момент поток помечается символом > .

В окне исходного кода наведите указатель мыши на значок маркера потока в поле и выберите значок флага (или один из пустых значков флагов) в подсказке

Значок флага становится красным.
Можно также щелкнуть правой кнопкой мыши значок маркера потока, навести курсор на Флаг, а затем выбрать поток для пометки в контекстном меню.

На панели инструментов Место отладки нажмите значок Показывать только помеченные потоки справа от поля Поток. Значок неактивен, если ни один поток не помечен.
Теперь в раскрывающемся списке Поток на панели инструментов отображается только помеченный поток. Нажмите кнопку Показывать только помеченные потоки еще раз, чтобы снова отображались все потоки.

Dica
Пометив несколько потоков, поместите курсор в редакторе кода, щелкните правой кнопкой мыши и выберите Запустить помеченные потоки до курсора. Обязательно выберите код, которого достигнут все потоки. Запустить помеченные потоки до курсора — потоки будут приостановлены в выбранной строке кода, что упрощает управление порядком выполнения путем .

Чтобы снять или установить метку текущего выполняющегося потока, выберите флаг Переключить состояние пометки текущего потока слева от кнопки Показывать только помеченные потоки. Помечать текущий поток удобно для поиска текущего потока, когда отображаются только помеченные потоки.

Чтобы снять метку с потока, наведите указатель мыши на маркер потока в исходном коде и выберите значок красного флажка, чтобы удалить его, или щелкните правой кнопкой мыши маркер потока и выберите Снять метку.

Установка и снятие меток для потоков в окне «Потоки»

В окне Потоки рядом с помеченными потоками стоит значок красного флажка, а у непомеченных потоков нет значков.

Выберите значок флага, чтобы изменить состояние потока на «помечено» или «не помечено» в зависимости от его текущего состояния.

Можно также щелкнуть правой кнопкой мыши строку и выбрать Пометить, Снять метку или Снять метку для всех потоков из контекстного меню.

На панели инструментов в окне Потоки также есть кнопка Показывать только помеченные потоки (правая из двух значков с флагом). Она работает так же, как кнопка на панели инструментов Место отладки, и обе кнопки управляют отображением в обоих расположениях.

Другие функции окна «Потоки»

В окне Потоки выберите заголовок любого столбца, чтобы отсортировать потоки по этому столбцу. Щелкните еще раз, чтобы изменить порядок сортировки. Если отображаются все потоки, то при выборе столбца со значком флага выполняется сортировка потоков по наличию метки.

Вторым столбцом окна Потоки (без заголовка) является столбец Текущий поток. Желтая стрелка в этом столбце отмечает текущую точку выполнения.

В столбце Расположение показано, где каждый поток отображается в исходном коде. Щелкните стрелку «Развернуть» рядом с пунктом Расположение или наведите указатель мыши на пункт, чтобы отобразить частичный стек вызовов для этого потока.

Dica

Для графического представления стеков вызовов для потоков используйте окно Параллельные стеки. Чтобы открыть это окно, во время отладки выберите Отладка> Окна > Параллельные стеки.

Помимо пунктов Пометить, Снять метку и Снять метку для всех потоков, в контекстном меню для окна Поток есть следующие элементы.

  • Кнопка Показать потоки в исходном коде.
  • Шестнадцатеричное отображение, которое изменяет идентификатор потока в окне Потоки с десятичного на шестнадцатеричный формат.
  •  — немедленное переключение на выполнение этого потока.
  • Переименовать — изменение имени потока.
  • Команды .

Отчеты об ошибках WPDB

Если вы знаете или подозреваете, что база данных вашего сайта вызывает проблемы, вы можете включить функцию отчетов об ошибках WPDB. Это также требует некоторого кодирования. После того, как вы включите создание отчетов об ошибках, вы можете настроить свой веб-сайт на отображение ошибок базы данных на экране.

Вы не должны делать это на живом веб-сайте, если вам все равно, будут ли ваши посетители получать сообщения об ошибках на своих экранах. Лучше использовать промежуточный веб-сайт (как описано ниже), где вы можете протестировать все, что хотите, не позволяя всем увидеть, что происходит под капотом.

Чтение этих отчетов об ошибках или журналов требует определенных технических знаний, как, например, медицинских знаний, чтобы прочитать рентгеновские снимки. Вам нужно будет расшифровать некоторые жаргоны программирования, сетей или баз данных, но вы, вероятно, найдете основную проблему, которая затрагивает ваш сайт, а затем обратитесь за помощью к кому-то, кто может решить эту конкретную проблему.

Чтобы начать генерировать отчеты об ошибках базы данных, добавьте в файл следующую строку (так же, как описано выше, для создания журнала отладки):

Если для него установить значение true, база данных начнет хранить все запросы, которые выполняет ваш веб-сайт. Затем вы сможете проверить количество запросов, вызванных каждым запросом страницы, и команды, используемые в каждом из них. Один из способов показать запросы на экране — добавить эти строки в ваш PHP-файл темы в вашем потоке выполнения:

Как только вы закончите с отладкой, вы должны удалить эти строки, чтобы вернуть ваш сайт к нормальной работе.

Системы компоновки в Qt5

Системы компоновки в Qt5 предоставляют разработчику простой и вместе с тем мощный способ максимально эффективного использования доступного пространства при помощи автоматического размещения виджетов с применением менеджеров компоновки. В статье будут рассмотрены следующие классы менеджеров компоновки:

   ;

   ;

   ;

   .

На предыдущих уроках мы узнали, что типичное Qt-приложение состоит из различных виджетов, позиционированием которых занимается программист, пишущий программу. Библиотека Qt поддерживает два способа размещения элементов управления на форме приложения:

   абсолютное позиционирование;

   позиционирование с помощью менеджеров компоновки.

Сигналы и слоты

В Qt применяется альтернативная техника, то есть используются слоты и сигналы. Сигнал выполняется тогда, когда происходит определенное событие. Виджеты Qt имеют множество предопределённых сигналов, но мы можем всегда отнаследоваться отвиджета и определить собственные сигналы для них. Слотом является функция, которая вызывается в ответ на определенный сигнал. Виджеты Qt также имеют множество предопределенных слотов, но наследование от виджетов и добавление собственных слотов является обычной практикой, так что Вы можете обрабатывать те сигналы, которые Вам интересны.

сигналы и слоты в Qt

Сигналы и слоты являются типо-безопасным механизмом. Сигнатура сигнала должа совпадать с сигнатурой принимающего слота (Хотя фактически, слот может иметь сигнатуру короче, чем сигнал, но слот принимает сигнал, поскольку игнорирует лишние аргументы). Поскольку сигнатуры совместимы, то компилятор может помочь определить несоответствия при использовании синтаксиса основанного на указателях. Тогда как при синтаксисе, основанном на макросах SIGNAL и SLOT возможно определить несоответствие типов только в runtime процессе. Сигналы и слоты слабо связаны: класс, который вызывает сигнал знает только слот, который принимает сигнал. Механизм сигналов и слотов в Qt обеспечивается, если Вы подключили сигнал к слоту, который будет вызываться с параметрами сигнала в нужным момент. Сигналы и слоты могут иметь несколько аргументов и типов. И они являются полностью типо-безопасными.

Слоты могут быть использованы для приема сигналов, но они являются также и обычными функциями. Просто как объект не знает что приняло его сигнал, так и слот не знает, какой сигнал подключен к нему. Это обеспечивает реальную независимость компонентов, которые могут быть созданы с Qt.

Вы можете подключить как множество сигналов к одному слоту, так и сигнал может быть подключен к множеству слотов. И даже возможно подключить сигнал непосредственно к другому сигналу. (Это вызовет второй сигнал, когда был вызван первый)

Вместе, сигналы и слоты создают мощный механизм компонентного программирования.

Создание проекта

Вначале нам необходимо создать проект. Сразу скажу, что наша программа будет консольным приложением. Для этого выберите или можно воспользоваться сочетанием клавиш :

Перед вами появится «Мастер настройки проектов». В левой колонке отметьте пункт , а затем в правой — :

На следующем шаге нужно будет указать имя для нашей будущей программы и папку, где будут располагаться файлы проекта. У меня это и соответственно:

На следующем шаге без изменений, поэтому просто нажимаем кнопку :

Теперь нам нужно выбрать набор компиляторов, который мы будем использовать для сборки нашего проекта. Я настоятельно рекомендую выбрать (сняв при этом отметки с остальных, если они у вас есть):

На последнем шаге нажимаем :

Теперь вы можете увидеть автоматически сгенерированный Qt-проект консольного приложения. Давайте рассмотрим его детально:

В корневой папке у нас лежит файл My_QtApplication.pro — это основной файл настроек проекта

Мы разберем его позже, а пока обратите внимание на папку «Исходники», в которой расположен файл main.cpp. Данный файл содержит минимальный исходный код нашей программы

Он был автоматически сгенерирован средствами Qt. Я не буду вдаваться в детальное описание класса QCoreApplication, скажу лишь, что он предоставляет обработку сообщений для консольного приложения Qt и является особенностью архитектуры построения Qt-приложений.

Запуск pdb с помощью REPL

Или вы можете создать следующий код в файле под названием debug_code.py:

Есть несколько способов начать работу с pdb. Для этого примера мы будем использовать терминал.

Переходим в папку, в которой был сохранен код.

Теперь запустим Python в терминале. Это откроет вам Python REPL, куда вы можете вставить код и запустить отладчик pdb. Вот как это выглядит:

Чтобы запустить pdb с вашим кодом, вы можете использовать pdb.run() и указать ему, что он должен сделать. В этом случае вы передаете debug_code.looper(5) как строку. Когда вы это сделаете, модуль pdb преобразует строку в вызов фактической функции debug_code.looper(5).

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

FirstForm

Оба класса формы необходимо будет сгенерировать с помощью визарда создания классов. При этом выберем в качестве базового класса

QWidget

.

После создания класса нужно будет исправить часть кода, а также исправить ui файл.

После того, как создадим новый класс, добавим кнопку на форму этого класса.

FirstForm.h

#ifndef FIRSTFORM_H
#define FIRSTFORM_H

// #include <QWidget> Было
#include "BaseWidget.h" // Стало

namespace Ui {
class FirstForm;
}

class FirstForm : public BaseWidget // Изменили базовый класс
{
    Q_OBJECT

public:
    explicit FirstForm(QWidget *parent = nullptr);
    ~FirstForm();

    // Переопределили метод базового класса
    virtual void methodFromBaseClass() const override;

private:
    Ui::FirstForm *ui;
};

#endif // FIRSTFORM_H

FirstForm.cpp

#include "FirstForm.h"
#include "ui_FirstForm.h"

#include <QDebug>

FirstForm::FirstForm(QWidget *parent) :
    BaseWidget(parent), // Выполним конструктор базового класса
    ui(new Ui::FirstForm)
{
    ui->setupUi(this);
    // Подключим кнопку к виртуальному методу
    connect(ui->pushButton, &QPushButton::clicked, this, &FirstForm::methodFromBaseClass);
}

FirstForm::~FirstForm()
{
    delete ui;
}

// Реализация переопределённого метода
void FirstForm::methodFromBaseClass() const
{
    BaseWidget::methodFromBaseClass();
    qDebug() << "First Form Method";
}

FirstForm.ui

А вот здесь самое интересное. Чтобы заставить проект компилироваться, нужно прописать базовый класс и информацию о наследовании в UI-файле.

Во-первых прописать базовый класс в тег widget класса формы.

Было

<widget class="QWidget" name="FirstForm">
    ...
</widget>

Стало

<widget class="BaseWidget" name="FirstForm">
    ...
</widget>

Во-вторых прописать информацию о кастомных виджетах с указанием наследования и заголовочного файла.

<customwidgets>
 <customwidget>
  <class>BaseWidget</class>
  <extends>QWidget</extends>
  <header>BaseWidget.h</header>
  <container>1</container>
 </customwidget>
</customwidgets>

В результате получим следующий UI-файл.

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>FirstForm</class>
 <widget class="BaseWidget" name="FirstForm">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0">
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>First Form Button</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <customwidgets>
  <customwidget>
   <class>BaseWidget</class>
   <extends>QWidget</extends>
   <header>BaseWidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

Отладка многопоточных приложений в Lazarus

Отладка в Lazarus всё ещё функционирует не полностью.

Отладка вывода

В однопоточном приложении Вы можете просто писать в консоль/терминал/что-то ещё и порядок строк будет сохранён таким, каким они были написаны.
В многопоточном приложении всё сложнее. Если пишут два потока, и строка, написанная потоком A находится перед строкой, написанной потоком B, то строки не обязательно написаны в таком порядке. Может даже случиться так, что поток пишет на вывод, пока другой поток пишет строку (? It can even happen, that a thread writes its output, while the other thread is writing a line. ?)

Модуль LCLProc содержит несколько функций, позволяющих каждому потоку писать в свой собственный файл журнала(вести свои логи):

 procedure DbgOutThreadLog(const Msg: string); overload;
 procedure DebuglnThreadLog(const Msg: string); overload;
 procedure DebuglnThreadLog(Args: array of const); overload;
 procedure DebuglnThreadLog; overload;

Пример:
Вместо writeln(‘Some text ‘,123); используйте

 DebuglnThreadLog();

Это добавит строчку ‘Some text 123’ в файл Log<PID>.txt, где <PID> — это идентификатор процесса данного потока.

Хорошей идеей является удаление файлов журнала перед каждым запуском:

 rm -f Log* && ./project1

Linux

Если Вы попытаетесь отладить многопоточное приложение на Linux, у Вас будет одна большая проблема: сервер X зависнет.\

Неизвестно, как решить эту проблему правильно, но обойти можно следующим образом:

Создать новый экземпляр Х:

 X :1 &

Тогда вы сможете, если вы хотите, создайте на рабочий стол сессии X:

 gnome-session --display=:1 &

Затем в Lazarus, в диалоге параметров запуска для проекта, выберите «Use display» и введите :1.

Теперь приложение будет работать на второй X сессии и вы сможете отлаживать её на первой.

Это было проверено с Free Pascal 2.0 и Lazarus 0.9.10 Windows и Linux.

Командной строкой для запуска Xnest является:

 Xnest :1 -ac

создать X сессию на :1, и отключить контроль доступа.

Просмотр стека вызовов

  1. Во время приостановки в цикле щелкните окно Стек вызовов, которое по умолчанию открыто в нижней правой области.

    Если оно закрыто, откройте его во время приостановки в отладчике, выбрав Отладка > Окна > Стек вызовов.

  2. Несколько раз нажмите клавишу F11, пока отладчик не приостановится в методе . Взгляните на окно Стек вызовов.

    В окне Стек вызовов показан порядок вызова методов и функций. В верхней строке приведена текущая функция (в данном приложении метод ). Во второй строке показано, что функция была вызвана из метода и т. д.

    Observação

    Окно Стек вызовов аналогично перспективе «Отладка» в некоторых интегрированных средах разработки, например Eclipse.

    Стек вызовов хорошо подходит для изучения и анализа потока выполнения приложения.

    Дважды щелкните строку кода, чтобы просмотреть исходный код. При этом также изменится текущая область, проверяемая отладчиком. Это действие не перемещает отладчик.

    Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставлять точки останова в указанные функции, перемещать отладчик с помощью функции Выполнение до текущей позиции и изучать исходный код. Дополнительные сведения см. в разделе Практическое руководство. просмотреть стек вызовов.

Стек вызовов может помочь разобраться в потоке выполнения приложения, показывая порядок, в котором вызываются методы и функции.

  1. Пока отладчик приостановлен в цикле , просмотрите окно Стек вызовов, которое по умолчанию открывается в нижней правой области редактора кода.

    Если окно Стек вызовов закрыто, нажмите сочетание клавиш Ctrl+D, A или в строке меню выберите Отладка >Windows >Стек вызовов.

    В окне Стек вызовов вы увидите желтый указатель в текущем методе .

  2. Несколько раз нажмите клавишу F11, пока отладчик не приостановится в методе .

    В верхней строке окна Стек вызовов показана текущая функция – метод . Во второй строке показано, что метод был вызван из метода .

    Observação

    Окно Стек вызовов аналогично перспективе «Отладка» в некоторых наборах IDE, например Eclipse.

    В окне Стек вызовов дважды щелкните строку кода, чтобы перейти к этому исходному коду. При этом изменится текущая область, проверяемая отладчиком. Это действие не перемещает отладчик.

    Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставить точки останова в указанные функции, переместить отладчик с помощью функции Выполнение до текущей позиции или перейти к исходному коду.

Дополнительные сведения о Стеке вызовов см. на этой странице.

Окно просмотра также может вычислять выражения

Окно просмотра также позволяет вам вычислять простые выражения. Если вы еще этого не сделали, запустите выполнение до курсора на строке 12. Затем попробуйте ввести в окно просмотра и посмотрите, что произойдет (результат должен быть равен 8).

Вы также можете выделить выражение в своем коде, а затем проверить значение этого выражения, наведя курсор мыши или добавив его в окно просмотра через контекстное меню, вызываемое правой кнопкой мыши.

Предупреждение

Идентификаторы в отслеживаемых выражениях будут вычислять свои текущие значения. Если вы хотите знать, какое значение на самом деле вычисляет выражение в вашем коде, сначала запустите выполнение до курсора к нему, чтобы все идентификаторы имели правильные значения.

Всплывающие сообщения

В Java под Android имеется специальный класс для вызова всплывающих сообщений, который называется Toast. Причём только для этого он и служит. Тогда как в QML для этих целей можно использовать Тип ToolTip, который может использоваться также как и обычная всплывающая подсказка для элементов интерфейса. ToolTip можно инстанцировать и прикреплять к различным объектам QML, также многие графические объекты QML уже имеют объект ToolTip, нужно только настроить его поведение.

Но в данном уроке постараемся реализовать стандартный Toast, который присутствует в Java Android.

Данный Toast в Java Android выглядел у меня так

Тогда как Toast в QML выглядел так

Поведение и внешний вид данных всплывающих сообщений похожи, а поэтому можем теперь посмотреть программный код.

Java

Для Java нужно импортировать класс Toast

import android.widget.Toast;

и вызвать всплывающее сообщение в нужной части кода

Toast.makeText(getApplicationContext(), "OK Button is pressed", Toast.LENGTH_LONG).show();

Получилось мало кода, и в данном уроке Java несколько выигрывает по объёму написанного кода, поскольку в QML мы постараемся приблизить внешний вид и поведение ToolTip QML к внешнему виду и поведению Toast в Java, а это уже потребует некоторой кастомизации.

QML

Для использования типа ToolTip импортируется модуль QtQuick.Controls 2

import QtQuick.Controls 2.3

Далее нужно добавить в главное окно приложения сам ToolTip, дать ему id и кастомизировать его.

ApplicationWindow {
    visible: true
    width: 360
    height: 520
    title: qsTr("QML Buttons")

    ToolTip {
        id: toast
        delay: 500
        timeout: 5000
        x: (parent.width - width) / 2
        y: (parent.height - 100)

        background: Rectangle {
            color: "gray"
            radius: 15
        }
    }

    // Остальной код
}

А потом уже установить ему текст и установить свойство visible на true.

onClicked: {
    toast.text = qsTr("OK Button is pressed")
    toast.visible = true
}

mainwindow.cpp

А в этом файле настроена логика, описанная в предыдущих абзацах. Просто осмотрите программный код и переходите к просмотру видео, там подробно показан весь процесс, продемонстрировано приложение, а также показано, что будет, если произвести написание кода с различным ошибками.

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* Объявляем и инициализируем кнопки
     * */
    QPushButton *but_1 = new QPushButton(this);
    QPushButton *but_2 = new QPushButton(this);
    QPushButton *but_3 = new QPushButton(this);

    /* Устанавливаем номера кнопок
     * */
    but_1->setText("1");
    but_2->setText("2");
    but_3->setText("3");

    /* Добавляем кнопки на слой с вертикальной ориентацией
     * */
    ui->verticalLayout->addWidget(but_1);
    ui->verticalLayout->addWidget(but_2);
    ui->verticalLayout->addWidget(but_3);

    /* Подключаем к кнопкам индивидуальные слоты
     * */
    connect(but_1, SIGNAL(clicked()), this, SLOT(slotButton1()));
    connect(but_2, SIGNAL(clicked()), this, SLOT(slotButton2()));
    connect(but_3, SIGNAL(clicked()), this, SLOT(slotButton3()));

    /* Подключаем сигнал с передачей номера кнопки к слоту вывода сообщения
     * */
    connect(this, &MainWindow::signalFromButton, this, &MainWindow::slotMessage);
}

MainWindow::~MainWindow()
{
    delete ui;
}

/* Слоты для обработки нажатия кнопок
 * */
void MainWindow::slotButton1()
{
    emit signalFromButton(1);
}

void MainWindow::slotButton2()
{
    emit signalFromButton(2);
}

void MainWindow::slotButton3()
{
    emit signalFromButton(3);
}

/* Слоты вывода сообщения
 * */
void MainWindow::slotMessage(int buttonID)
{
    QMessageBox::information(this,
                             "Уведомление о нажатой кнопке",
                             "Нажата кнопка под номером " + QString::number(buttonID));
}

Таймер

Таймер используется для реализации одиночного действия или же повторяющихся задач. Хорошим примером, где мы можем задействовать таймер, являются часы; каждую секунду мы должны обновлять нашу метку, отображающую текущее время.

В следующем примере мы попробуем отобразить в окне текущее местное время.

Заголовочный файл — timer.h:

#pragma once

#include <QWidget>
#include <QLabel>

class Timer : public QWidget {

public:
Timer(QWidget *parent = 0);

protected:
void timerEvent(QTimerEvent *e);

private:
QLabel *label;
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#pragma once
 
#include <QWidget>
#include <QLabel>
 

classTimerpublicQWidget{

public

Timer(QWidget*parent=);

protected

voidtimerEvent(QTimerEvent*e);

private

QLabel*label;

};

Файл реализации — timer.cpp:

#include «timer.h»
#include <QHBoxLayout>
#include <QTime>

Timer::Timer(QWidget *parent)
: QWidget(parent) {

QHBoxLayout *hbox = new QHBoxLayout(this);
hbox->setSpacing(5);

label = new QLabel(«», this);
hbox->addWidget(label, 0, Qt::AlignLeft | Qt::AlignTop);

QTime qtime = QTime::currentTime();
QString stime = qtime.toString();
label->setText(stime);

startTimer(1000);
}

void Timer::timerEvent(QTimerEvent *e) {

Q_UNUSED(e);

QTime qtime = QTime::currentTime();
QString stime = qtime.toString();
label->setText(stime);
}

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
27
28

#include «timer.h»
#include <QHBoxLayout>
#include <QTime>
 

Timer::Timer(QWidget*parent)

QWidget(parent){

QHBoxLayout*hbox=newQHBoxLayout(this);

hbox->setSpacing(5);

label=newQLabel(«»,this);

hbox->addWidget(label,,Qt::AlignLeft|Qt::AlignTop);

QTime qtime=QTime::currentTime();

QString stime=qtime.toString();

label->setText(stime);

startTimer(1000);

}
 

voidTimer::timerEvent(QTimerEvent*e){

Q_UNUSED(e);

QTime qtime=QTime::currentTime();

QString stime=qtime.toString();

label->setText(stime);

}

Для отображения времени мы используем виджет-метку:

label = new QLabel(«», this);

1 label=newQLabel(«»,this);

Затем мы определяем текущее местное время и устанавливаем его в виджет-метку:

QTime qtime = QTime::currentTime();
QString stime = qtime.toString();
label->setText(stime);

1
2
3

QTime qtime=QTime::currentTime();

QString stime=qtime.toString();

label->setText(stime);

Запускаем таймер (при этом каждые 1000 мс генерируется событие таймера):

startTimer(1000);

1 startTimer(1000);

Для работы с событиями таймера необходимо переопределить метод timerEvent():

void Timer::timerEvent(QTimerEvent *e) {

Q_UNUSED(e);

QTime qtime = QTime::currentTime();
QString stime = qtime.toString();
label->setText(stime);
}

1
2
3
4
5
6
7
8

voidTimer::timerEvent(QTimerEvent*e){

Q_UNUSED(e);

QTime qtime=QTime::currentTime();

QString stime=qtime.toString();

label->setText(stime);

}

Основной файл программы — main.cpp:

#include <QApplication>
#include «timer.h»

int main(int argc, char *argv[]) {

QApplication app(argc, argv);

Timer window;

window.resize(250, 150);
window.setWindowTitle(«Timer»);
window.show();

return app.exec();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include <QApplication>
#include «timer.h»
 

intmain(intargc,char*argv){

QApplication app(argc,argv);

Timer window;

window.resize(250,150);

window.setWindowTitle(«Timer»);

window.show();

returnapp.exec();

}

Результат выполнения программы:

Какие классы позволяют преобразовать байтовые потоки в символьные и обратно

OutputStreamWriter — мост между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.

OutputStream outputStream       = new FileOutputStream("c:\\data\\output.txt");
Writer       outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

outputStreamWriter.write("Hello World");

outputStreamWriter.close();

InputStreamReader — аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.

InputStream inputStream       = new FileInputStream("c:\\data\\input.txt");
Reader      inputStreamReader = new InputStreamReader(inputStream, "UTF-8");

int data = inputStreamReader.read();
while(data != -1){
    char theChar = (char) data;
    data = inputStreamReader.read();
}

inputStreamReader.close();

Заключение

Инструменты отладки в основном предназначены для специалистов по разработке программного обеспечения. Но даже если вы не разработчик, если вы просто ведете блог на WordPress, полезно иметь хотя бы базовые знания о том, как отслеживать и отлаживать ваш сайт. Таким образом, вы можете дать разработчику некоторую информацию, которая поможет ему найти источник проблемы.

Также рекомендуем прочитать:

  1. 10 способов SEO оптимизации WordPress и производительности контента
  2. 7 способов, как увеличить скорость загрузки вашего сайта
  3. Что такое черный список URL-адресов и как от него защититься?
  4. Увеличить производительность WordPress с помощью этих плагинов
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: