2015-11-13 5 views
0

В настоящее время я работаю над своим проектом для моей магистерской диссертации в мехатронике/робототехнике. Целью проекта является чтение в .stl-файле и вычисление пути для промышленного робота.QT Creator Main.cpp MainWindow.cpp

До сих пор все работало отлично для меня, но теперь мой профессор хочет, чтобы я разработал графический интерфейс, потому что до сих пор я просто использовал окно команд и написал все параметры вручную. Теперь я работаю с Qt Creator и разработал простой графический интерфейс для моего проекта.

В этом интерфейсе я получил RadioButton для файлов ascii. Чтобы мои функции работали, я должен определить, вводит ли пользователь файл ascii или двоичный файл. Но вот моя первая проблема. В окне команд я просто проверяю argv[] на строку "-ascii". Если пользователь вводит это, флаг устанавливается в значение false.

if(0 == strcmp(argv[i], "-ascii")) { 
    isBinaryFormat = false; 
} 

Теперь я просто хочу сделать то же самое внутри графического интерфейса. Если флажок RadioButton установлен, флаг имеет значение false. Поэтому я написал следующее в файле main.cpp

if(ui->radioButton->isChecked()) { 
    isBinaryFormat = false; 
} 

Но щ неизвестна в главной функции. После поиска помощи в google я только что нашел учебники, записывающие код в файле mainwindow.cpp. Но как я могу отправить информацию из файла mainwindow моей основной функции в файл main.cpp.

Второй вопрос был бы, если я использую метод QFileDialog::getOpenFilename, как я могу передать имя файла другим своим функциям. Идея заключается в том, что пользователь выбирает файл в любом месте своего ПК, и программа открывает файл и обрабатывает его. Но здесь у меня такая же проблема. Я могу бросить файл, но как я могу передать информацию от mainwindow.cpp до моего main.cpp.

Я благодарен за любую помощь, которую я получаю. Очень благодарен одинокий кодер

ответ

0

Прежде всего, вы не пишете код интерфейса в main.cpp. Вы пишете его, где MainWindow Класс находится в MainWindow.cpp и MainWindow.h.

Тогда ваш ui-> будет работать, потому что он имеет доступ к этому пространству имен.

Я не понимаю, почему у вас были бы функции в Main.cpp? Не видя больше кода, вы вряд ли получите ответ на этот вопрос.

Если вы хотите использовать внешние функции в своих классах, либо объявите методы в классе напрямую, либо создайте новый файл, например global_function.h и .cpp, которые вы можете включить в свой класс.(Не забудьте охранников заголовка)

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

if(!ui->radioButton->isChecked()) 
{ 
    isBinaryFormat = false; 
} 

из:

Если RadioButton проверяется флаг установлен в ложь.


QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), 
               "/home", 
               tr("Images (*.png *.xpm *.jpg)")); 

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

Пожалуйста, прочитайте дополнительную информацию о том, как использовать Qt.

+0

В main.cpp у меня есть функции и классы, которые я использую для обработки заданного .stl-файла. Здесь CAD-данные нарезаются слоями и создается файл с контуром для робота. Эта часть работает нормально, поэтому я не публиковал код других функций. Я не хотел показывать что-то хорошее, в то время как моя личная проблема связана с чем-то другим. Но я мог бы написать код моей основной функции, который я использовал в программе для командного окна. – user3794592

+0

@ user3794592 переключение функций на новый файл и включение его в класс MainWindow по-прежнему будет лучшей идеей и упростит вашу жизнь. – deW1

+0

Итак, вы имеете в виду, что я должен получить весь свой код из main.cpp в файл, например process.cpp/.h, и использовать его в mainwindow.cpp? – user3794592

1

Речь идет не только о файлах, но и о классе. Узнайте о них. Решение заключается в добавлении поглотитель к вашему MainWindow класса, возвращающие проверяется ли radioButton:

class MainWindow : public QMainWindow 
{ 
    public: 
     // optionally, move implementation in the source file 
     bool isBinaryFormatChecked() const 
     { 
      return ui->radioButton->isChecked(); 
     } 

    // other stuff ... 
}; 

И тогда вы можете получить доступ к нему в вашем main как window.isBinaryFormatChecked() или
window->isBinaryFormatChecked() в зависимости от того, есть ли у вас указатель или нет. Другим способом было бы сделать ui в вашем MainWindow общедоступным, чтобы вы могли получить доступ ко всему пользовательскому интерфейсу, но это нарушает правильную инкапсуляцию.

0

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

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

Смежные вопросы