2015-04-16 6 views
2

Я создал вспомогательную ветку в QMdiArea моего главного окна. Затем я сделал QDialog, в котором я хочу, чтобы пользователь вводил название названия для окна Sub. Но я всегда получаю сообщение об ошибке при попытке изменить windowTitle() на эту переменную.Можно ли переименовать подстроку qt?

Есть ли способ обновить windowTitle()?

moduleName.cpp

#include "stdafx.h" 
#include "moduleName.h" 
#include "iwb4.h" 
#include <Windows.h> 
#include <QtGui/QAction> 
#include <qdom.h> 
#include <qmdiarea.h> 
#include "ui_module_name.h" 
#include "ui_iwb4.h" 
#include <qmdisubwindow.h> 

moduleName::moduleName(QDialog *parent) 
    : QDialog(parent) 
{ 
    ui.setupUi(this); 
    show(); 

    // connect ok button to save the module name 
    connect(ui.okButton, SIGNAL(pressed()), this, SLOT(okClicked())); 
} 

moduleName::~moduleName() 
{ 

} 

void moduleName::okClicked() 
{ 
    iwb4 iwb; 
    QTextDocument* tName = ui.textEdit->document(); 
    iwb.p_name = tName->toPlainText(); 

    moduleName::close(); 

    iwb.name(); 
} 

moduleName.h

#ifndef MODULENAME_H 
#define MODULENAME_H 

#include <QtGui/QWidget> 
#include "ui_module_name.h" 


class moduleName : public QDialog 
{ 
    Q_OBJECT 

public: 
    moduleName(QDialog *parent = 0); 
    ~moduleName(); 

public slots: 
    void okClicked(); 

protected: 
    Ui::Dialog ui; 

}; 

#endif // MODULENAME_H 

iwb4.cpp

#include "stdafx.h" 
#include "iwb4.h" 
#include <Windows.h> 
#include "ui_iwb4.h" 
#include <QtGui/QAction> 
#include <qdom.h> 
#include <qmdiarea.h> 
#include "ui_module_name.h" 
#include "moduleName.h" 
#include <qmdisubwindow.h> 


iwb4::iwb4(QWidget *parent, Qt::WFlags flags) 
    : QMainWindow(parent, flags) 
{ 
    ui.setupUi(this); 
    iwb4::showMaximized(); 

    p_name = " "; 

    // new module button 
    connect(ui.actionNewModule, SIGNAL(triggered()), this, SLOT(makeModule())); 
} 

//////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////// 

iwb4::~iwb4() 
{ 

} 


void iwb4::newModule(QString name) 
{ 
    m_file = new QFile("C:\\Users\\Hanna\\Desktop\\iwb\\Projekt\\iwb4\\iwb4\\Datenmodell\\module.xml"); 
    m_file->open(QFile::ReadWrite | QFile::Text); 
    QDomDocument doc; 
    doc.setContent(m_file); 
    m_file->close(); 

    m_dockWidget = new QDockWidget(m_parent); 
    m_dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea | Qt::TopDockWidgetArea); 
    m_dockWidget->showMaximized(); 
    m_dockWidget->setTitleBarWidget(new QWidget()); 
    m_pTableWidget = new QTableWidget(m_dockWidget); 
    m_dockWidget->setWidget(m_pTableWidget); 
    addDockWidget(Qt::LeftDockWidgetArea, m_dockWidget); 

    m_pTableWidget->setRowCount(10); 

    QDomElement elem = doc.documentElement(); 
    m_pTableWidget->setColumnCount(elem.childNodes().count()); 
    for (int i = 0; i < elem.childNodes().count(); i++) 
    { 
     QString header = elem.childNodes().at(i).toElement().attribute("Name"); 
     m_TableHeader += header; 
    } 

    m_pTableWidget->setHorizontalHeaderLabels(m_TableHeader); 
    m_pTableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); 
    m_pTableWidget->verticalHeader()->setVisible(false); 
    m_pTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); 
    m_pTableWidget->setSelectionMode(QAbstractItemView::SingleSelection); 
    m_pTableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    m_pTableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    m_pTableWidget->setShowGrid(true); 
    m_pTableWidget->resizeColumnsToContents(); 
    m_pTableWidget->resizeRowsToContents(); 
    m_pTableWidget->setMaximumWidth(400); 
    m_pTableWidget->setMaximumHeight(300); 

    connect(m_pTableWidget, SIGNAL(cellDoubleClicked (int, int)), 
     this, SLOT(cellSelected(int, int))); 
} 

void iwb4::makeModule() 
{ 
    QString name; 
    name = p_name; 

    newModule(name); 

    QDockWidget *dock = m_dockWidget; 
    m_subWindow = ui.mdiArea->addSubWindow(dock); 
    ui.mdiArea->DontMaximizeSubWindowOnActivation; 
    dock->show(); 
    dock->activateWindow(); 

    // make rename option in right click menu 
    QMenu *menu = m_subWindow->systemMenu(); 
    rename = new QAction(tr("Rename"),menu); 
    menu->addAction(rename); 
    connect(rename, SIGNAL(triggered()), this, SLOT(newName())); 
} 

void iwb4::newName() 
{ 
    moduleName* p_nameDialog = new moduleName(); 
} 

void iwb4::name() 
{ 
    QString name = p_name; 
    m_subWindow->setWindowTitle(name); 
} 

iwb4.h

#ifndef IWB4_H 
#define IWB4_H 

#include <QtGui/QMainWindow> 
#include "ui_iwb4.h" 

class iwb4 : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    iwb4(QWidget *parent = 0, Qt::WFlags flags = 0); 
    ~iwb4(); 

private: 

private slots: 
    void makeModule(); 

public slots: 
    void newName(); 

public: 
    void newModule(QString name); 
    void name(); 

    QFile* m_file; 
    QDockWidget* m_dockWidget; 
    QTableWidget* m_pTableWidget; 
    QMdiSubWindow* m_subWindow; 
    QStringList m_TableHeader; 

    QString p_name; 

    QAction *rename; 

protected: 
    Ui::iwb4Class ui; 

}; 

#endif // IWB4_H 

enter image description here

Благодарим за помощь.

ответ

0

windowTitle() возвращает копию, так что эта линия не имеет смысла (вы изменяете копию только):

window->windowTitle() = name; 

Вместо этого, просто использовать setWindowTitle непосредственно:

window->setWindowTitle(name); 
+0

я все еще получаю сообщение об ошибке хотя: Необработанное исключение в 0x64f4461e (QtGuid4.dll) в iwb4.ex e: 0xC0000005: Доступ к адресу обнаружения нарушения доступа 0x0000004d. – hbrown

+0

@hbrown Используйте отладочную сборку Qt и просто запустите ее в отладчике, вы, надеюсь, поймете, почему она пытается прочитать то, что не является адресом. –

0

WindowTitle() просто возвращает только другая копия названия окна, поэтому его изменение не изменяет заголовок, который вы хотите изменить.

Если вам нужно изменить заголовок, то напрямую используйте setWindowTitle (имя); ,

window-> setWindowTitle (window-> windowTitle()); это бесполезное утверждение, потому что вы снова задали заголовок окна его оригинального названия.

0
void iwb4::name() 
{ 
    QString name; 
    name = p_name; 
    QMdiSubWindow* window; 
    window = m_subWindow; 
    window->windowTitle() = name; 
    window->setWindowTitle(window->windowTitle()); 
} 

window->windowTitle() является газопоглотителем.

window->setWindowTitle() является сеттер.

Задача getters - получить вам значение, тогда как задание сеттеров должно обновить значение.

Так работает это будет работать:

void iwb4::name() 
{ 
    QString name; 
    name = "MyNewWindowName"; 
    m_subWindow->setWindowTitle(name); 
} 

У вас есть такая же проблема здесь:

void iwb4::makeModule() 
{ 
    QString name; 
    name = p_name; 

    newModule(name); 

    QDockWidget *dock = m_dockWidget; 
    m_subWindow = ui.mdiArea->addSubWindow(dock); 
    ui.mdiArea->DontMaximizeSubWindowOnActivation; 
    ui.mdiArea->windowTitle() = name; 
    ui.mdiArea->setWindowTitle(ui.mdiArea->windowTitle()); 
    dock->show(); 
    dock->activateWindow(); 

    // make rename option in right click menu 
    QMenu *menu = m_subWindow->systemMenu(); 
    rename = new QAction(tr("Rename"),menu); 
    menu->addAction(rename); 
    connect(rename, SIGNAL(triggered()), this, SLOT(newName())); 
} 

изменить его на:

void iwb4::makeModule() 
{ 
    QString name; 
    name = p_name; 

    newModule(name); 

    QDockWidget *dock = m_dockWidget; 
    m_subWindow = ui.mdiArea->addSubWindow(dock); 
    ui.mdiArea->DontMaximizeSubWindowOnActivation; 
    //ui.mdiArea->windowTitle() = name; // <-- 
    ui.mdiArea->setWindowTitle(name); // <-- 
    dock->show(); 
    dock->activateWindow(); 

    // make rename option in right click menu 
    QMenu *menu = m_subWindow->systemMenu(); 
    rename = new QAction(tr("Rename"),menu); 
    menu->addAction(rename); 
    connect(rename, SIGNAL(triggered()), this, SLOT(newName())); 
} 
+0

Я все еще получаю это сообщение об ошибке: Необработанное исключение в 0x64f4461e (QtGuid4.dll) в iwb4.exe: 0xC0000005: Доступ к чтению с ошибкой 0x0000004d. – hbrown

+0

является m_subWindow фактическим QMdiSubWindow? Покажите свое определение и его объявление. – deW1

+0

Я добавил код к моему оригинальному сообщению. – hbrown

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

  • Нет связанных вопросов^_^