开发者

how to use Qt setWindowFilePath

开发者 https://www.devze.com 2023-01-11 14:13 出处:网络
I can\'t seem to get setWindowFilePath to work in开发者_如何学JAVA any of my projects.The value is stored and can be retrieved, but it never shows up in the title bar of my app.It does work correctly

I can't seem to get setWindowFilePath to work in开发者_如何学JAVA any of my projects. The value is stored and can be retrieved, but it never shows up in the title bar of my app. It does work correctly in a sample app I downloaded, but I can't find what they do differently. Anyway, here's a simple app I created to demonstrate the problem. I pasted the code from the 3 files, mainwin.h, main.cpp, and mainwin.cpp below.

Any ideas? I'm using Qt 4.6.3 on Windows 7, with the MS compiler.

#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");

}


It is QTBUG-16507.

And easy workaround (just tested it in my project) is:

/********************** 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);
}
/******************************************************************************/

It will just set title to value that you used before widget show (in constructor, in your case). Works like a charm.


For some reason, setWindowFilePath() does not seem to work when called from QMainWindow's constructor. But you can use single shot timer:

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");
}

And remember to use \\ in literal paths instead of \


I just discovered that with QTimer::singleShot, apparently there is no way to pass parameters. To pass parameters (in my case, the file path retrieved using QSettings), use:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号