как использовать Qt setWindowFilePath - PullRequest
1 голос
/ 16 августа 2010

Я не могу заставить setWindowFilePath работать в любом из моих проектов. Значение сохраняется и может быть получено, но оно никогда не отображается в строке заголовка моего приложения. Это работает правильно в примере приложения, которое я скачал, но я не могу найти то, что они делают по-другому. Во всяком случае, вот простое приложение, которое я создал, чтобы продемонстрировать проблему. Я вставил код из 3 файлов, mainwin.h, main.cpp и mainwin.cpp ниже.

Есть идеи? Я использую Qt 4.6.3 на Windows 7 с компилятором MS.

#ifndef MAINWIN_H
#define MAINWIN_H

#include <QMainWindow>

class mainwin : public QMainWindow
{
    Q_OBJECT
public:
    explicit mainwin(QWidget *parent = 0);

signals:

public slots:

};

#endif // MAINWIN_H

#include "mainwin.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    app.setApplicationName("my test");
    app.setOrganizationName("NTFMO");
    mainwin window;
    window.show();
    return app.exec();
}

#include "mainwin.h"

mainwin::mainwin(QWidget *parent) :
    QMainWindow(parent)
{
  setWindowFilePath("C:\asdf.txt");

}

Ответы [ 3 ]

2 голосов
/ 27 апреля 2011

Это QTBUG-16507 .

И простое решение (только что протестировано в моем проекте):

/********************** HACK: QTBUG-16507 workaround **************************/
void MyMainWindow::showEvent(QShowEvent *event)
{
    QMainWindow::showEvent(event);
    QString file_path = windowFilePath();
    setWindowFilePath(file_path+"wtf we have some random text here");
    setWindowFilePath(file_path);
}
/******************************************************************************/

Это просто установит заголовок на значениечто вы использовали до показа виджета (в конструкторе, в вашем случае).Работает как шарм.

1 голос
/ 16 августа 2010

По какой-то причине setWindowFilePath() не работает при вызове из конструктора QMainWindow. Но вы можете использовать одноразовый таймер:

class mainwin : public QMainWindow
{
...
private slots:
    void setTitle();
}

mainwin::mainwin(QWidget *parent) :
    QMainWindow(parent)
{
    QTimer::singleShot(0, this, SLOT(setTitle()));
}

void mainwin::setTitle()
{
    setWindowFilePath("C:\\asdf.txt");
}

И не забудьте использовать \\ в буквальных путях вместо \

0 голосов
/ 16 августа 2010

Я только что обнаружил, что с QTimer :: singleShot, по-видимому, нет способа передать параметры.Чтобы передать параметры (в моем случае путь к файлу, полученный с помощью QSettings), используйте:

QMetaObject::invokeMethod(this, "Open", Qt::QueuedConnection, Q_ARG(QString, last_path));
...