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

Я люблю Java, Swift и другие, но когда дело доходит до создания настольных приложений, C ++ в тандеме с Qt по-прежнему остается лучшим. Вот несколько причин, по которым я все еще увлекаюсь Qt в 2017 году:

Легкий

Qt с C ++ просто прост в использовании. Единственная сопоставимая среда разработки - XCode. Имея массу отличных примеров при запуске, вам не нужно много времени, чтобы намочить ноги. Я знаю, что привлекательность быть программистом связана с такой сложностью, которую «простые смертные» едва могут осознать, но я также большой поклонник упрощения рудиментарных задач, таких как создание пользовательского интерфейса, чтобы это стало искусством, а не это можно сравнить с решением сложной математической задачи. Исходя из фона Java Swing и PyGTK, Qt был для меня раем.

Быстрый. Очень быстро.

Общеизвестно, что C ++ - очень быстрый язык, и я считаю, что Qt частично воспользовался этой скоростью. Сравнивая разработку и взаимодействие с программным обеспечением, которое я создавал в прошлом, Qt всегда казался немного более проворным (я не проводил никаких тестов, поэтому могу ошибаться). Даже сегодня, когда я провожу большую часть своих дней в XCode, я все еще не могу не восхищаться скоростью и легкостью Qt. Это, конечно, может быть связано с моими внутренними предубеждениями и ограничениями как кодировщика. Ниже приведен фрагмент грубой сортировки слиянием на основе графического интерфейса пользователя, которую я проделал ДОЛГО назад. Работает как шарм и заметно четче, чем Java, при работе с большим набором данных. Можете попробовать сами.

// MergeSort.cpp
// Class MergeSort member-function definition.
#include <vector>
using std::vector;
#include “merge_sort_budget.h” // class MergeSoft definition
/**
 The constructor for the MergeSort class.
 
 @param btList btList the budget tab list.
 */
MergeSortBudget::MergeSortBudget(BudgetTabList btList)
{
 size = btList.size(); //validate vectorSize
// fill the vector with random BudgetTabItems with different dates
 for (int i = 0; i < btList.size(); i++)
 {
 data.push_back(btList.at(i));
 }
} // end MergeSort constructor
//
/**
 Split vector, sort subvectors and merge subvectors into sorted vector
 
 @param btList the budget tab list.
 @return nothing.
 */
void MergeSortBudget::sort(BudgetTabList btList)
{
 sortSubVector(0, size — 1, btList); // recursively sort entire vector
} // end function sort
/**
 Recursive function to sort subvectors
 
 @param low the low tab.
 @param high the high tab.
 @param btList the budget tab list.
 @return nothing.
 */
void MergeSortBudget::sortSubVector(int low, int high, BudgetTabList btList)
{
 // test base case; size of vector equals 1
 if ((high — low) >= 1) // if not base case
 {
 int middle1 = (low + high) / 2; // calculate middle of vector
 int middle2 = middle1 + 1; // calculate next element over
// split vector in half; sort each half (recursive calls)
 sortSubVector(low, middle1, btList); // first half of vector
 sortSubVector(middle2, high, btList); // second half of vector
// merge two sorted vectors after split calls return
 merge(low, middle1, middle2, high, btList);
 } // end if
} // end function sortSubVector
/**
 Merge two sorted subvectors into one sorted subvector
 
 @param left the left.
 @param middle1 the high tab.
 @param middle2 the high tab.
 @param right the high tab.
 @param btList the budget tab list.
 @return nothing.
 */
void MergeSortBudget::merge(int left, int middle1, int middle2, int right, BudgetTabList btList)
{
 int leftIndex = left; // index into left subvector
 int rightIndex = middle2; // index into right subvector
 int combinedIndex = left; // index into temporary working vector
 vector<BudgetTabItem> combined; // working vector
 for (int i = 0; i < size; i++)
 combined.push_back(BudgetTabItem(“”, 0, 0, 0));
// merge vectors until reaching end of either
 while (leftIndex <= middle1 && rightIndex <= right)
 {
 // place smaller of current elements into result
 // and move to next space in vector
 if ((data[leftIndex].getYear() >= data[rightIndex].getYear()
 && data[leftIndex].getMonth() > data[rightIndex].getMonth()) ||
 (data[leftIndex].getYear() > data[rightIndex].getYear()
 && data[leftIndex].getMonth() >= data[rightIndex].getMonth()) ||
 (data[leftIndex].getYear() > data[rightIndex].getYear()
 && data[leftIndex].getMonth() < data[rightIndex].getMonth()))
 combined[combinedIndex++] = data[leftIndex++];
 else
 combined[combinedIndex++] = data[rightIndex++];
 } // end while
if (leftIndex == middle2) // if at end of left vector
 {
 while (rightIndex <= right) //copy in rest of right vector
 combined[combinedIndex++] = data[rightIndex++];
 } // end if
 else // at end of right vector
 {
 while (leftIndex <= middle1) // copy in rest of left vector
 combined[combinedIndex++] = data[leftIndex++];
 } // end else
// copy values back into original vector
 for (int i = left; i <= right; i++)
 {
 BudgetTabItem item = combined[i];
 item.setTabIndex(i);
 data[i] = item;
 }
} // end function merge
/**
 Display elements in vector
 
 @param none.
 @return nothing.
 */
void MergeSortBudget::displayElements() const
{
 displaySubVector(0, size — 1);
} // end function displatElements
/**
 Display certain values in vector
 
 @param none.
 @return nothing.
 */
void MergeSortBudget::displaySubVector(int low, int high) const
{
 // output spaces for alignment
 for (int i = 0; i < low; i++)
 //cout << “ “;
// output elements left in vector
 for (int i = low; i <= high; i++)
 {
 BudgetTabItem item = data[i];
 }
} // end function displatSubVector
/**
 Gets the sorted index.
 
 @param month. the month of the tab.
 @param year. the year of tab.
 @return sortedIndex 
 */
int MergeSortBudget::getSortedTabIndex(int month, int year)
{
 int sortedIndex;
 for (int i = 0; i < size; i++)
 {
 if ((data[i].getYear() == year) && (data[i].getMonth() == month))
 {
 sortedIndex = data[i].getTabIndex();
 }
 }
 return sortedIndex;
}

Независимость от платформы

При разработке мобильных приложений уделялось много внимания тому, чтобы не зависеть от платформы, и с учетом этого было создано множество инструментов. Qt сделал это ДЛИННОЕ время назад на рабочем столе, и сделал это с размахом. Перенос ваших приложений на разные платформы не кажется тяжелым трудом. Они работают одинаково на всех ОС / платформах практически без переноса.

Выход из текущего духа времени

Программы. Программы. Программы! Мобильные приложения! «Эй, чувак, ты можешь создать мне приложение, братан?» - сказал старый приятель из колледжа. В последнее время кажется, что повсеместное распространение мобильных устройств успешно ассоциируется с мобильными устройствами. Может это правда. Это также может быть утомительно, как если бы основные СМИ постоянно твердили об ИИ. Может быть, я просто сентиментален, но Qt ощущается как подлинное и реальное программирование - культура программирования, не основанная на шумихе или последних новинках. Он продвинутый, но примитивный. Он исчерпывающий, но не закрытый. Это кажется настоящим. Это кажется правдой. Это не похоже на StackOverflow-y. Недавно я посмотрел крутой документальный фильм WIRED о стартапах в Израиле. Документальный фильм заставил меня почувствовать то же самое, что я чувствовал, когда впервые начал возиться с Qt - как будто я был частью чего-то истинного. Посмотрите это ниже:

Есть целое поколение программистов, которые могут совершить трагическую ошибку, игнорируя рабочий стол и Qt (с C ++). Это повредило бы им не только с точки зрения истории, но и с точки зрения их целостности и масштабности. Существует целый большой мир компьютерных наук: в настоящее время разрекламированные области - это искусственный интеллект и наука о данных. По всей видимости, я буду работать с обоими на постоянной основе в течение следующих шести месяцев. При этом ничто не сравнится с интимностью создания чего-то с нуля с помощью чего-то вроде Qt - это удовольствие, что ни один кодер не должен отказывать себе.

Я Табо Класс и работаю в Spreebie. Ваше здоровье.