Сохранение qtablewidget в excel

Обновлено: 04.07.2024

QAbstractItemView.EditTrigger имеет несколько параметров, а QAbstractItemView.NoEditTriggers является одним из перечислений QAbstractItemView.EditTrigger.

параметр XX XX
QAbstractItemView.NoEditTriggers 0 Невозможно изменить содержимое таблицы
QAbstractItemView.CurrentChanged 1 Изменить ячейку в любое время
QAbstractItemView.DoubleClicked 2 Дважды щелкните ячейку
QAbstractItemView.SelectedClicked 4 Нажмите на выбранный контент
QAbstractItemView.CurrentChanged 8 Изменить ячейку в любое время
QAbstractItemView.AnyKeyPressed 16 Дважды щелкните ячейку
QAbstractItemView.AllEditTriggers 31 Дважды щелкните ячейку

3. Свойства выбора ячейки

  • Выбрать всю строку
  • Один выбранный и несколько выбранных настроек

3. Отображение и скрытие заголовка.

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

4. Настройки шрифта ячейки

// Также: если вам нужно использовать этот шрифт для всех ячеек, вы можете использовать tableWidget-> setFont (QFont ("Helvetica"));

5. Установите выравнивание текста в ячейке.

Используйте функцию newItem.setTextAlignment () для установки.Параметрами этой функции являются выравнивание внутри ячейки, а также то, является ли последовательность ввода символов слева направо или справа налево.Если оба параметра установлены, просто используйте Qt.AlignHCenter | Qt.AlignVCenter можно использовать.

// метод
QTableWidgetItem *t_test = new QTableWidgetItem(xList);
t_test->setTextAlignment(Qt::AlignCenter);


6. Объединить ячейки

7. Задайте ширину строки и столбца.

  • Укажите ширину строки и столбца
  • Автоматически настраивать ширину строки и столбца

// метод первый:
tableWidget->resizeColumnsToContents();
tableWidget->resizeRowsToContents();

// Метод второй:
ui-> tableWidget-> horizontalHeader () -> setResizeMode (QHeaderView :: Stretch); адаптивная ширина столбца
ui-> tableWidget-> verticalHeader () -> setResizeMode (QHeaderView :: Stretch); Адаптивная высота строки

// Автоматически настраивать высоту строки в соответствии с содержимым
tableWidget->resizeColumnsToContents( 2 ); // 2 строки
tableWidget->resizeRowsToContents( 2 );

// Эффект альтернативной таблицы:
table->horizontalHeader()->setStretchLastSection( true ); // Остальные столбцы сохраняют ширину по умолчанию, а последний столбец растягивается для заполнения.

8. Другие примеры настроек

tableWidget->setRowHeight(rowIndex, 24 ); // Устанавливаем высоту строки

QTableWidget *table = new QTableWIdget(this);

table->setColumnCount( 5 ); // Устанавливаем количество столбцов

table->setRowCount( 3 ); // Устанавливаем количество строк /

/Установить имя столбца/

/Добавить содержимое в ячейку/

void addItemContent(int row, int column, QString content)

/Добавить иконку в ячейку/

QTableWidgetItem *item = new QTableWidgetItem(QIcon( “myImage.jpg” ), NULL ); // Добавляем только значки, без строк

QTableWidgetItem *item = new QTableWidgetItem(QIcon( “myImage.jpg” ), myString); // Добавляем иконку и строку

table->setItem(row, column, item);

int row = table->rowCount();

int column = table->columnCount();

// Адаптируем ширину заголовка строки и столбца, последний столбец заполнит пустую часть

// Адаптируем ширину заголовков строк и столбцов, и все столбцы делятся поровну, чтобы заполнить пустую часть

// Адаптировать высоту строки. Если строк много, высота строки не будет постоянно уменьшаться. Когда она достигает определенного значения, автоматически создается QScrollBar

// Устанавливаем щелчок для выбора строки

// Сделать содержимое каждой строки недоступным для редактирования

// Set может выбрать только одну строку, а не несколько строк

/Удалите номер строки каждой строки/

QHeaderView *headerView = table->verticalHeader();

/Установить для выбора ячейки или строки/

Выберите ячейку: таблица-> setCurrentCell (строка, столбец, QItemSelectionModel :: Select);

Выберите строку: table-> setCurrentCell (row, QItemSelectionModel :: Select); (обратите внимание, что столбец здесь не имеет значения)

В предыдущей части я рассказывал о создании модуля для запуска SQL-запросов и оболочки, в которой эти модули запускаются. После недолгой работы с запросами возникает очевидный вопрос — а как воспользоваться результатом выборки, кроме как посмотреть на экране?

Для этого стоит сделать дополнительные инструменты экспорта и копирования данных. Экспортировать будем в файл в формате Excel, а копировать в системный буфер в формате HTML.

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




Панель инструментов

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

Для панелей инструментов в Qt есть готовый класс QToolBar, от него породим свой ToolBar. Сейчас нам достаточно одного тулбара, но заложимся на возможность добавления в программу нескольких панелей. Каждой панели нужен свой конфигурационный файл со своим набором кнопок, поэтому имя файла будем передавать параметром при создании тулбара.
Конфигурационный файл будет традиционно в формате Ini и кодировке UTF-8.


Синтаксис определения кнопок в наших руках, в простейшем случае нам нужны три вещи:

— текст на кнопке
— модуль, содержащий функцию кнопки
— функция кнопки

Определимся, что функция кнопки принимает один параметр — текущее дочернее окно. Что именно будет делать модуль с ним — задача модуля кнопки, а задача тулбара ограничивается только его вызовом.

Создадим такой файл tools.ini:


Теперь в питоне разбираем определения из Ini-файла:


Метод выполнения, назначенный всем кнопкам, будет импортировать нужный модуль и вызывать из него назначенную кнопке функцию. Чтобы нам не прописывать каждый модуль в перечне импорта тулбара, воспользуемся библиотекой importlib. Осталось только узнать, что за кнопка была нажата и от какого QAction пришел сигнал — за это отвечает стандартный метод QObject.sender(), далее возьмем сохраненные в нем параметры и сделаем то, что задумано в модуле (что бы это ни было).


Осталось добавить нашу панель в наше главное окно (модуль tasktree.py)


Можем запустить и проверить, появилась ли панель:


Может быть не так симпатично, как на первой картинке, главное, что работает.

Модуль функций инструментов

Теперь самое время сделать модуль с функциями кнопок. Модуль у нас будет один, потому что функции экспорта и копирования будут работать с одним источником данных и по одинаковым правилам, нет смысла разносить их по разным модулям.

Наши функции будут работать с таблицами данных QTableView, который мы использовали в модулях для просмотра результатов запроса. Чтобы сохранить независимость модулей, определять нужный компонент будем «на лету» — либо это текущий выбранный (focused) компонент QTableView в текущем окне, либо первый попавшийся нужного класса среди дочерних элементов текущего окна.


Из таблицы получаем список выбранных ячеек. Если ничего не выбрано, то принудительно выбираем всё.


Наверное, вы уже в курсе, что в Qt вы не получаете массив данных напрямую, вместо этого вы работаете с индексами в модели. Индекс QModelIndex представляет собой простую структуру и указывает на конкретную позицию данных (строку row() и столбец column(), а в иерархии указание на индекс родителя parent()). Получив индекс, можно из него получить сами данные методом data().

Мы получили список индексов выбранных ячеек в модели, но индексы в этом списке следуют в том порядке, в котором пользователь их выделял, а не отсортированные по строкам и столбцам. Нам же удобнее будет работать не со списком, а с словарем (позиция → индекс) и сортированными списками задействованных строк и столбцов.


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


Поэтому в d.rows есть каждая использованная строка, в d.columns есть каждый использованный столбец, но их сочетание необязательно есть в d.indexes.

Еще нам для пущей красоты нужен перечень наименований столбцов, который выводятся в QTableView. Получим их из модели методом headerData:


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

Экспорт в Excel

Для экспорта в файлы Excel я воспользовался пакетом xlsxwriter. Он устанавливается, как обычно, через pip:


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

Имя xlsx-файла, в который будем экспортировать, запросим у пользователя, у Qt есть такая функция. В PyQt функция возвращает список из выбранного имени файла и использованного фильтра. Если вернулся список из пустых строк, то это означает, что пользователь отказался от выбора.


Танцы вокруг QDateTime добавлены из-за разного понимания даты/времени в Python, Qt и Excel — во-первых, пакет xlsxwriter умеет работать с питоновским datetime, но не умеет с QDateTime из Qt, поэтому приходится дополнительно его конвертировать специальной функцией toPyDateTime; во-вторых, Excel умеет работать только с датами с 01.01.1900, а всё, что было до этого времени для Excel — просто строка.

Результат экспорта в Excel:


Копирование в системный буфер в формате HTML

Не всегда нужен отдельный файл с выборкой, часто, особенно когда данных немного, удобнее скопировать их в табличном виде в системный буфер (clipboard), а затем вставить в нужное место, будь то Excel, Word, редактор веб-страниц или что-то другое.

Наиболее универсальным способом копирования табличных данных через буфер — это обычный формат HTML. В Windows, *nix и MacOS сильно разные способы работы с буфером (не говоря о том, что их несколько), поэтому хорошо, что Qt скрывает от нас детали реализации.

Всё, что нам нужно — создать объект QMimeData, заполнить его через метод setHtml фрагментом HTML-разметки, и отдать в системный clipboard, который доступен через QApplication


Таблицу собираем построчно, начиная с заголовков.



Результат, вставленный в Word:

Здесь границы таблицы видны только благодаря включенной в Word настройке "Показывать границы текста", на самом деле они невидимы. Чтобы таблица копировалась с явными границами, нужно изменить стиль таблицы в тэге table. Предоставляю это сделать вам.

Заключение

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

Исходники, использованные в примерах, как и ранее, выложены на github под лицензией MIT.

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

Работаем с файлами MS Excel на Python

Для работы с Excel файлами из Python мне известны 2 варианта:

Использование библиотек

Итак, первый метод довольно простой и хорошо описан. Например, есть отличная статья для описания работы c xlrd, xlwt, xlutils. Поэтому в данном материале я приведу небольшой кусок кода с их использованием.

Для начала загрузим нужные библиотеки и откроем файл xls на чтение и выберем
нужный лист с данными:


Теперь давайте посмотрим, как считать значения из нужных ячеек:


Как видно чтение данных не составляет труда. Теперь запишем их в другой файл. Для этого создам новый excel файл с новой рабочей книгой:


Запишем в новый файл полученные ранее данные и сохраним изменения:


Из примера выше видно, что библиотека xlrd отвечает за чтение данных, а xlwt — за запись, поэтому нет возможности внести изменения в уже созданную книгу без ее копирования в новую. Кроме этого указанные библиотеки работают только с файлами формата xls (Excel 2003) и у них нет поддержки нового формата xlsx (Excel 2007 и выше).

Чтобы успешно работать с форматом xlsx, понадобится библиотека openpyxl. Для демонстрации ее работы проделаем действия, которые были показаны для предыдущих библиотек.

Для начала загрузим библиотеку и выберем нужную книгу и рабочий лист:


Как видно из вышеприведенного листинга сделать это не сложно. Теперь посмотрим как можно считать данные:


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

Теперь посмотрим как нам произвести запись и сохранить данные:


Из примера видно, что запись, тоже производится довольно легко. Кроме того, в коде выше, можно заметить, что openpyxl кроме имен ячеек может работать и с их индексами.

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

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

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

Работа с com-объектом

В своих отчетах я предпочитаю использовать второй способ, а именно использование файла Excel через com-объект с использованием библиотеки win32com. Его преимуществом, является то, что вы можете выполнять с файлом все операции, которые позволяет делать обычный Excel с использованием VBA.

Проиллюстрируем это на той же задаче, что и предыдущие примеры.

Для начала загрузим нужную библиотеку и создадим COM объект.


Теперь мы можем работать с помощью объекта Excel мы можем получить доступ ко всем возможностям VBA. Давайте, для начала, откроем любую книгу и выберем активный лист. Это можно сделать так:


Давайте получим значение первой ячейки и последовательности:


Как можно заметить, мы оперируем здесь функциями чистого VBA. Это очень удобно если у вас есть написанные макросы и вы хотите использовать их при работе с Python при минимальных затратах на переделку кода.

Посмотрим, как можно произвести запись полученных значений:


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

Однако, внимательный читатель, обратит внимание на переменную i, которая инициализируется не 0, как принято python, а 1. Это связано с тем, что мы работаем с индексами ячеек как из VBA, а там нумерация начинается не с 0, а с 1.

На этом закончим разбор способов работы с excel файлами в python и перейдем к обратной задаче.

Вызываем функции Python из MS Excel

Может возникнуть такая ситуация, что у вас уже есть какой-либо функция, которая обрабатывает данные на python, и нужно перенести ее функциональность в Excel. Конечно же можно переписать ее на VBA, но зачем?

Для использования функций python в Excel есть прекрасная надстройка ExcelPython. С ее помощью вы сможете вызывать функции написанные на python прямо из Excel, правда придется еще написать небольшую обертку на VBA, и все это будет показано ниже.

Итак, предположим у нас есть функция, написанная на python, которой мы хотим воспользоваться:


На вход ей подается список, состоящий из списков, это одно из условий, которое должно выполняться для работы данной функции в Excel.

Сохраним функцию в файле plugin.py и положим его в ту же директорию, где будет лежать наш excel файл, с которым мы будем работать.

Теперь установим ExcelPython. Установка происходит через запуск exe-файла и не вызывает затруднений.

Когда все приготовления выполнены, открываем тестовый файл excel и вызовем редактор VBA (Alt+F11). Для работы с вышеуказанной надстройкой необходимо ее подключить, через Tools->References, как показано на рисунке:


Ну что же, теперь можно приступить к написанию функции-обертки для нашего Python-модуля plugin.py. Выглядеть она будет следующим образом:


Итак, что же происходит в данной функции?

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

Затем, с помощью PyCall , вызываем нужную нам функцию из указанного модуля. В качестве параметров PyCall получает следующее:

  1. Объект модуля, полученный на предыдущем шаге
  2. Имя вызываемой функции
  3. Параметры, передаваемые функции (передаются в виде списка)

Теперь, чтобы убедиться в работоспособности нашей связки, вызовем нашу свежеиспеченую функцию на листе в Excel:


Как видно из рисунка все отработало правильно.

Надо отметить, что в данном материале используется старая версия ExcelPython, и на GitHub'e автора доступна новая версия.

Заключение

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

Также хочу заметить, что указанные пакеты не являются единственными и в статье опущено рассмотрение, таких пакетов как xlsxwriter для генерации excel файлов или xlwings, который может работать с Excel файлами «на лету», а также же PyXLL, который выполняет аналогичные функции ExcelPython.

Кроме этого в статье я попытался несколько обобщить разборасанный по сети материал, т.к. такие вопросы часто фигурируют на форумах и думаю некоторым будет полезно иметь, такую «шпаргалку» под рукой.

Общие методы в классе QTableWidget

метод описание
setROwCount(int row) Установите количество строк в элементе управления таблицы QTableWidget
setColumnCount(int col) Установите количество столбцов в элементе управления таблицы QTableWidget
setHorizontalHeaderLabels() Установите горизонтальную метку элемента управления таблицы QTableWidget
setVerticalHeaderLabels() Установить вертикальную метку элемента управления таблицы QTableWidget
setItem(int ,int ,QTableWidgetItem) Добавить элементы управления в элемент управления ячейки каждого параметра элемента управления таблицы QTableWidget
horizontalHeader() Получите заголовок таблицы элемента управления таблицы QTableWidget, чтобы выполнить скрытие
rowCount() Получить количество строк в элементе управления таблицы QTableWidget
columnCount() Получить количество столбцов в элементе управления таблицы QTableWidget
setEditTriggers(EditTriggers triggers) Установить, можно ли редактировать таблицу, установить значение перечисления таблицы
setSelectionBehavior Настройка поведения выбора таблицы
setTextAlignment() Установить выравнивание текста в ячейке
setSpan(int row,int column,int rowSpanCount,int columnSpanCount) Объединить ячейки, чтобы изменить строку строки и столбца ячейки, объединить столбцы rowSpancount и columnSpanCount
строка: количество строк для изменения
столбец: количество столбцов, которые будут изменены
rowSpanCount: количество строк, которые будут объединены
columnSpanCount: количество столбцов для объединения
setShowGrid() По умолчанию отображение таблицы имеет сетку. Вы можете установить True или False для ее отображения. По умолчанию установлено значение True.
setColumnWidth(int column,int width) Установите ширину ряда ячеек
setRowHeight(int row,int height) Установите высоту столбца ячейки

Перечислимые типы значений для правил редактирования

опции значение описание
QAbstractItemView.NoEditTriggers0No 0 Невозможно изменить содержимое таблицы
QAbstractItemView.CurrentChanged1Editing 1 Изменить ячейки в любое время
QAbstractItemView.DoubleClicked2Editing 2 Дважды щелкните ячейку
QAbstractItemView.SelectedClicked4Editing 4 Нажмите на уже выбранный контент
QAbstractItemView.EditKeyPressed8Editing 8 Изменить ячейку при нажатии клавиши-модификатора
QAbstractItemView.AnyKeyPressed16Editing 16 Нажмите любую клавишу, чтобы изменить ячейку
QAbstractItemView.AllEditTriggers31Editing 31 Включая все вышеперечисленные условия

Перечислите значения для поведения выбора таблицы

выбрать значение описание
QAbstractItemView.SelectItems0Selecting 0 Выберите одну ячейку
QAbstractItemView.SelectRows1Selecting 1 Выберите строку
QAbstractItemView.SelectColumns2Selecting 2 Выберите столбец

Горизонтальное выравнивание текста ячейки

опции описание
Qt.AlignLeft Выровняйте содержимое ячейки по левому краю ячейки.
Qt.AlignRight Выровняйте содержимое ячейки по правому краю ячейки
Qt.AlignHCenter По центру горизонтально в доступном пространстве
Qt.AlignJustify Выровнять текст в пределах доступного пространства, по умолчанию слева направо

Вертикальное выравнивание текста ячейки

опции описание
Qt.AlignTop Выровнять по верху
Qt.AlignBottom Выровнять по дну
Qt.AlignVCenter По центру в вертикальном пространстве в доступном пространстве
Qt.AlignBaseline Выровнять с базовой линией

Если вы хотите установить горизонтальное и вертикальное выравнивание, например центрировать вверх и вниз и центрировать влево и вправо в табличном пространстве, просто используйте Qt, AlignHCenter и Qt, AlignVCenter

Пример: базовое использование QTableWidget

这里写图片描述

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

Анализ кода

Создайте объект QTableWidget и установите в таблице 4 строки и 3 столбца.

Установить заголовок таблицы

Сгенерируйте объект QTableWidgetItem и добавьте его в строки 0 и 0 таблицы

Оптимизация 1:Установить метки заголовка вертикальной таблицы

这里写图片描述

Эффект заключается в следующем

Оптимизация 2: Установить заголовок таблицы в режим масштабирования
Используйте функцию horizontalHeader () объекта QTableWidget, чтобы установить для таблицы режим адаптивного масштабирования. Вы можете изменить размер сетки в соответствии с размером окна.

这里写图片描述


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

这里写图片描述


Оптимизация 4: Выделена вся строка таблицы
Таблица выбирает одну ячейку по умолчанию. Следующий код может установить целую строку для выбора.

这里写图片描述


Оптимизация 5:Соотнесите ширину и высоту строк и столбцов с шириной и высотой текстового содержимого.

这里写图片描述


Оптимизация 6: Показать и скрыть заголовок таблицы

这里写图片描述


Оптимизация 7: Размещение элементов управления в ячейках
QTableWidget не только позволяет помещать текст в ячейку, но также и элементы управления. QTableWidget.setItem () используется для добавления основных элементов управления PyQt.
Здесь в ячейку добавляются раскрывающийся список и кнопка, а также устанавливается поле между элементом управления и ячейкой. Если это пиксели размером 3 пикселя, код выглядит следующим образом

这里写图片描述

Пример 2: быстро найти указанную строку в таблице

这里写图片描述

Эффект как показано

Пример 3: Расширенное использование QTableWidget

这里写图片描述

Начальная операция, эффект заключается в следующем

Оптимизация 1:Установите цвет текста ячейки и три цвета текста в первой строке на красный

这里写图片描述


Оптимизация 2: Жирный шрифт

这里写图片描述


Оптимизация 4: Выравнивание текста в ячейке
Это изменяет выравнивание текста веса Ван Ву в правом нижнем углу.

这里写图片描述


Оптимизация 5:Объединить ячейки
Измените ячейки в первой строке и первом столбце таблицы, чтобы они занимали 5 строк и 1 столбец.

这里写图片描述


Оптимизация 7: Не отображать разделительную линию в таблице
Функция setShowGrid () класса QTableWidget унаследована от класса QTableView и используется для указания, отображать ли разделительную линию таблицы.

这里写图片描述


Оптимизация 8: Добавить картинку в ячейку
Вы также можете добавить изображение в ячейку и отобразить информацию описания изображения, код выглядит следующим образом
Эта картинка помещается в ячейку веса Ван Ву.

这里写图片描述

Пример четвертый: отображение картинок в ячейках

这里写图片描述

Эффект заключается в следующем

Пример 5. Поддержка контекстного меню

这里写图片描述

Соответствующие документы и адреса для скачивания

Интеллектуальная рекомендация


Отладка исходного кода Windbg

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

CentOS поддерживает NTFS.

Я использую двойную систему Win7 и Centos6.4. CONTOS по умолчанию для диска файлов для файловых систем, которые не имеют форматов NTFS. Жесткий диск в Win7 не может быть идентифицирован в Centos. 1 Ск.

Читайте также: