Дизайнер qt5, использующий fileopen, отображающий путь к файлу в строке редактирования, есть ли проблема сделать это таким образом?

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

private slots:
    void vpkButton_clicked();

и после Ui::MainWindow *ui; я добавил QLineEdit *vpkPathTxt; в mainwindow.cpp: после

    ui->setupUi(this);

я добавил

    connect( this->ui->vpkButton, SIGNAL( clicked() ), this, SLOT(vpkButton_clicked()) );

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

    vpkPathTxt = this->ui->vpkPathTxt;

функция в моем main.cpp стала очень простой: (объявления QString вверху вне пустот)

void MainWindow::vpkButton_clicked()
{
    vpkName = QFileDialog::getOpenFileName(this,
        tr("Open VPK File"), "~/", tr("VPK Files (*_dir.vpk)"));
    vpkPathTxt->setText(vpkName);
    qDebug() << vpkName;
}

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


person angjminer    schedule 11.12.2013    source источник
comment
Почему вы используете другую переменную vpkPathTxt, указывающую на ваш ui->vpkPathTxt? Просто чтобы сэкономить на наборе текста? Идея указателя ui заключается в том, что он инкапсулирует все элементы пользовательского интерфейса, поэтому он не мешает другим переменным, необходимым для логики вашего класса. Кроме того, this-> является необязательным; Я бы оставил это.   -  person leemes    schedule 11.12.2013
comment
Это потому, что vpkPathTxt — это неинициализированный указатель, который вы используете в других операторах. Замените их на ui->vpkPathTxt и удалите переменную в заголовочном файле. Если я вас правильно понял, у вас есть такая переменная в шапке ниже Ui::MainWindow *ui.   -  person leemes    schedule 12.12.2013
comment
без vpkPathTxt = this-›ui-›vpkPathTxt; приложение просто исчезает, когда я выбираю файл, путь которого будет отображаться в нем, используя ui-›vpkPathTxt.setText(vpkName); с треском проваливается, может быть, потому, что у меня нет правильного подключения/   -  person angjminer    schedule 12.12.2013
comment
Хорошо, последнее, что вы описали, странно. Попробуйте следующее: удалите коннект и переименуйте свой слот в точно on_vpkButton_clicked(); это подключит его к сигналу автоматически для вас. Вместо того, чтобы писать название слота вручную, вы можете щелкнуть правой кнопкой мыши в дизайнере на виджете, выбрать перейти к слоту, выбрать слот, и он будет создан соответствующим образом.   -  person leemes    schedule 12.12.2013
comment
вы господи супер!!! большое спасибо, что нашли время ответить мне.   -  person angjminer    schedule 12.12.2013


Ответы (1)


Одна проблема с вашим слотом заключается в том, что вы не рассматриваете случай, когда пользователь отказывается от диалога «открыть файл». В этом случае функция QFileDialog::getOpenFileName возвращает нулевую строку QString, поэтому вам следует продолжать свою логику только в том случае, если возвращаемое значение не является пустой строкой:

if (!vpkName.isNull()) {
    ...
}

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

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

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

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

person leemes    schedule 11.12.2013
comment
Спасибо, добавление слота с помощью правого клика сработало отлично (код также помещался на нужную страницу). пусть тебе сегодня приснится классный сон. :) - person angjminer; 12.12.2013