Сохранение qtablewidget в excel
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 получает следующее:
- Объект модуля, полученный на предыдущем шаге
- Имя вызываемой функции
- Параметры, передаваемые функции (передаются в виде списка)
Теперь, чтобы убедиться в работоспособности нашей связки, вызовем нашу свежеиспеченую функцию на листе в 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 Ск.
Читайте также: