diff options
Diffstat (limited to 'tdeioslave/media/mounthelper')
-rw-r--r-- | tdeioslave/media/mounthelper/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tdeioslave/media/mounthelper/dialog.cpp | 13 | ||||
-rw-r--r-- | tdeioslave/media/mounthelper/dialog.h | 5 | ||||
-rw-r--r-- | tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp | 398 | ||||
-rw-r--r-- | tdeioslave/media/mounthelper/tdeio_media_mounthelper.h | 28 | ||||
-rw-r--r-- | tdeioslave/media/mounthelper/unlockdialog.ui | 42 |
6 files changed, 236 insertions, 253 deletions
diff --git a/tdeioslave/media/mounthelper/CMakeLists.txt b/tdeioslave/media/mounthelper/CMakeLists.txt index 90afad33f..cf7ca553f 100644 --- a/tdeioslave/media/mounthelper/CMakeLists.txt +++ b/tdeioslave/media/mounthelper/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/tdeioslave/media/libmediacommon + ${CMAKE_BINARY_DIR} ${TDE_INCLUDE_DIR} ${TQT_INCLUDE_DIRS} ) @@ -31,6 +32,6 @@ set( ${target}_SRCS tde_add_executable( ${target} AUTOMOC SOURCES ${${target}_SRCS} - LINK mediacommon-static tdeio-shared + LINK mediacommon-static tdeio-shared ${TDEHW_LIBRARIES} DESTINATION ${BIN_INSTALL_DIR} ) diff --git a/tdeioslave/media/mounthelper/dialog.cpp b/tdeioslave/media/mounthelper/dialog.cpp index f2cdb6b53..a257ca6d8 100644 --- a/tdeioslave/media/mounthelper/dialog.cpp +++ b/tdeioslave/media/mounthelper/dialog.cpp @@ -23,11 +23,10 @@ #include "dialog.h" Dialog::Dialog(TQString url, TQString iconName) : - KDialogBase(NULL, "Dialog", true, "Unlock Storage Device", (Cancel|User1), User1, false, KGuiItem(i18n("Unlock"), "unlocked" )) + KDialogBase(NULL, "Dialog", true, i18n("Unlock Storage Device"), (Cancel|User1), User1, false, KGuiItem(i18n("Unlock"), "unlocked" )) { unlockDialog = new UnlockDialog(this); - unlockDialog->errorBox->hide(); unlockDialog->descLabel->setText(unlockDialog->descLabel->text().arg(url)); unlockDialog->descLabel->adjustSize(); unlockDialog->adjustSize(); @@ -37,7 +36,7 @@ Dialog::Dialog(TQString url, TQString iconName) : TQPixmap pixmap = TDEGlobal::iconLoader()->loadIcon(iconName, TDEIcon::NoGroup, TDEIcon::SizeLarge); unlockDialog->encryptedIcon->setPixmap( pixmap ); - connect(unlockDialog->passwordEdit, TQT_SIGNAL (textChanged(const TQString &)), this, TQT_SLOT (slotPasswordChanged(const TQString &))); + connect(unlockDialog->passwordEdit, TQ_SIGNAL (textChanged(const TQString &)), this, TQ_SLOT (slotPasswordChanged(const TQString &))); setMainWidget(unlockDialog); } @@ -52,14 +51,6 @@ TQString Dialog::getPassword() return unlockDialog->passwordEdit->text(); } -void Dialog::slotDialogError(TQString errorMsg) -{ - kdDebug() << __func__ << "(" << errorMsg << " )" << endl; - - unlockDialog->errorLabel->setText(TQString("<b>%1</b>").arg(errorMsg)); - unlockDialog->errorBox->show(); -} - void Dialog::slotPasswordChanged(const TQString &text) { enableButton( User1, !text.isEmpty() ); diff --git a/tdeioslave/media/mounthelper/dialog.h b/tdeioslave/media/mounthelper/dialog.h index 8444ec7dd..d2b2925a9 100644 --- a/tdeioslave/media/mounthelper/dialog.h +++ b/tdeioslave/media/mounthelper/dialog.h @@ -36,12 +36,10 @@ #include "unlockdialog.h" -class KryptoMedia; - class Dialog : public KDialogBase { -Q_OBJECT +TQ_OBJECT public: Dialog(TQString url, TQString iconName); @@ -50,7 +48,6 @@ public: TQString getPassword(); public slots: - void slotDialogError(TQString errorMsg); void slotPasswordChanged(const TQString &text); private: diff --git a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp index 65b53a0f4..90f3caa3f 100644 --- a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp +++ b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.cpp @@ -19,6 +19,10 @@ Boston, MA 02110-1301, USA. */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include <tdecmdlineargs.h> #include <tdelocale.h> #include <tdeapplication.h> @@ -33,223 +37,238 @@ #include <kprocess.h> #include <tdestartupinfo.h> #include <kmimetype.h> -#ifdef __TDE_HAVE_TDEHWLIB +#ifdef WITH_TDEHWLIB #include <tdehardwaredevices.h> #endif #include "dialog.h" #include "tdeio_media_mounthelper.h" -const Medium MountHelper::findMedium(const KURL &url) +const Medium MountHelper::findMedium(const TQString &device) { DCOPRef mediamanager("kded", "mediamanager"); - - // Try filename first - DCOPReply reply = mediamanager.call( "properties", url.fileName() ); - if ( !reply.isValid() ) { - m_errorStr = i18n("The TDE mediamanager is not running.")+"\n"; + DCOPReply reply = mediamanager.call("properties", device); + if (!reply.isValid()) + { + m_errorStr = i18n("The TDE mediamanager is not running.\n"); return Medium(TQString::null, TQString::null, TQString::null); } - const Medium& medium = Medium::create(reply); - if ( medium.id().isEmpty() ) { - // Try full URL now - reply = mediamanager.call( "properties", url.prettyURL() ); - if ( !reply.isValid() ) { - m_errorStr = i18n("Internal Error"); - return Medium(TQString::null, TQString::null, TQString::null); - } - return Medium::create(reply); - } else { - return medium; - } + const Medium &medium = Medium::create(reply); + return medium; } -MountHelper::MountHelper() : TDEApplication() +void MountHelper::mount(const Medium &medium) { - TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("mount", medium.id()); + TQStringVariantMap mountResult; + if (reply.isValid()) { + reply.get(mountResult); + } + if (!mountResult.contains("result") || !mountResult["result"].toBool()) { + m_errorStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : i18n("Unknown mount error."); + errorAndExit(); + } +} - m_errorStr = TQString::null; +void MountHelper::unmount(const Medium &medium) +{ + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("unmount", medium.id()); + TQStringVariantMap unmountResult; + if (reply.isValid()) { + reply.get(unmountResult); + } + if (!unmountResult.contains("result") || !unmountResult["result"].toBool()) { + m_errorStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : i18n("Unknown unmount error."); + kdDebug() << "medium unmount " << m_errorStr << endl; + errorAndExit(); + } +} - KURL url(args->url(0)); - const Medium medium = findMedium(url); +void MountHelper::unlock(const Medium &medium) +{ + TQString device = medium.deviceNode(); + if (device.isEmpty()) { + m_errorStr = i18n("Try to unlock an unknown medium."); + errorAndExit(); + } - if (medium.id().isEmpty()) + TQString iconName = medium.iconName(); + if (iconName.isEmpty()) { - if (m_errorStr.isEmpty()) { - m_errorStr+= i18n("%1 cannot be found.").arg(url.prettyURL()); - } - TQTimer::singleShot(0, this, TQT_SLOT(error()) ); - return; + TQString mime = medium.mimeType(); + iconName = KMimeType::mimeType(mime)->icon(mime, false); } + m_mediumId = medium.id(); + m_dialog = new Dialog(device, iconName); + connect(m_dialog, TQ_SIGNAL(user1Clicked()), this, TQ_SLOT(slotSendPassword())); + connect(m_dialog, TQ_SIGNAL(cancelClicked()), this, TQ_SLOT(slotCancel())); + m_dialog->show(); +} - if (!medium.isMountable() && !args->isSet("e") && !args->isSet("s")) +void MountHelper::lock(const Medium &medium) +{ + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("lock", medium.id(), true); + TQStringVariantMap lockResult; + if (reply.isValid()) { + reply.get(lockResult); + } + if (!lockResult.contains("result") || !lockResult["result"].toBool()) { + m_errorStr = lockResult.contains("errStr") ? lockResult["errStr"].toString() : i18n("Unknown lock error."); + kdDebug() << "medium lock " << m_errorStr << endl; + errorAndExit(); + } +} + +void MountHelper::eject(const Medium &medium) +{ +#ifdef WITH_TDEHWLIB + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("eject", medium.id()); + TQStringVariantMap ejectResult; + if (reply.isValid()) { + reply.get(ejectResult); + } + if (!ejectResult.contains("result") || !ejectResult["result"].toBool()) { + m_errorStr = ejectResult.contains("errStr") ? ejectResult["errStr"].toString() : i18n("Unknown eject error."); + kdDebug() << "medium eject " << m_errorStr << endl; + errorAndExit(); + } + else { - m_errorStr = i18n("%1 is not a mountable media.").arg(url.prettyURL()); - TQTimer::singleShot(0, this, TQT_SLOT(error()) ); - return; + ::exit(0); // Success! } +#endif - TQString device = medium.deviceNode(); - TQString mount_point = medium.mountPoint(); + // Otherwise fall back to tdeeject + TDEProcess *proc = new TDEProcess(this); + *proc << "tdeeject"; + *proc << medium.deviceNode(); + connect(proc, TQ_SIGNAL(processExited(TDEProcess*)), this, TQ_SLOT(ejectFinished(TDEProcess*))); + proc->start(); +} + +void MountHelper::safeRemoval(const Medium &medium) +{ + DCOPRef mediamanager("kded", "mediamanager"); + DCOPReply reply = mediamanager.call("safeRemove", medium.id()); + TQStringVariantMap safeRemoveResult; + if (reply.isValid()) { + reply.get(safeRemoveResult); + } + if (!safeRemoveResult.contains("result") || !safeRemoveResult["result"].toBool()) { + m_errorStr = safeRemoveResult.contains("errStr") ? safeRemoveResult["errStr"].toString() : i18n("Unknown safe removal error."); + kdDebug() << "medium safeRemoval " << m_errorStr << endl; + errorAndExit(); + } +} - m_isCdrom = medium.mimeType().find("dvd") != -1 || medium.mimeType().find("cd") != -1; +void MountHelper::openRealFolder(const Medium &medium) +{ + Medium &m = const_cast<Medium&>(medium); + if (!m.isMounted()) + { + // If the medium is not mounted, try mounting it first + mount(m); + m = findMedium(m.deviceNode()); + } - if (args->isSet("d")) + if (m.isMounted()) { - if (!medium.isEncrypted()) - { - m_errorStr = i18n("%1 is not an encrypted media.").arg(url.prettyURL()); - TQTimer::singleShot(0, this, TQT_SLOT(error()) ); - return; - } - if (!medium.needDecryption()) - { - m_errorStr = i18n("%1 is already unlocked.").arg(url.prettyURL()); - TQTimer::singleShot(0, this, TQT_SLOT(error())); - return; - } + system((TQString("kfmclient exec 'file://") + m.mountPoint()).local8Bit() + "'"); + } + else + { + m_errorStr = i18n("Try to open an unknown medium."); + errorAndExit(); + } +} - TQString iconName = medium.iconName(); - if (iconName.isEmpty()) - { - TQString mime = medium.mimeType(); - iconName = KMimeType::mimeType(mime)->icon(mime, false); +MountHelper::MountHelper() : TDEApplication() +{ + TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); + m_errorStr = TQString::null; + + const Medium medium = findMedium(args->arg(0)); + if (medium.id().isEmpty()) + { + if (m_errorStr.isEmpty()) { + m_errorStr+= i18n("%1 cannot be found.").arg(args->arg(0)); } + errorAndExit(); + } - m_mediumId = medium.id(); - dialog = new Dialog(url.prettyURL(), iconName); - dialog->show(); + TQString device = medium.deviceNode(); + if (!medium.isMountable() && !medium.isEncrypted() && !args->isSet("e") && !args->isSet("s")) + { + m_errorStr = i18n("%1 is not a mountable or encrypted media.").arg(device); + errorAndExit(); + } - connect(dialog, TQT_SIGNAL (user1Clicked()), this, TQT_SLOT (slotSendPassword())); - connect(dialog, TQT_SIGNAL (cancelClicked()), this, TQT_SLOT (slotCancel())); - connect(this, TQT_SIGNAL (signalPasswordError(TQString)), dialog, TQT_SLOT (slotDialogError(TQString))); + if (args->isSet("m")) + { + mount(medium); + ::exit(0); } else if (args->isSet("u")) { - DCOPRef mediamanager("kded", "mediamanager"); - DCOPReply reply = mediamanager.call("unmount", medium.id()); - TQStringVariantMap unmountResult; - if (reply.isValid()) { - reply.get(unmountResult); - } - if (unmountResult.contains("result") && unmountResult["result"].toBool()) { - ::exit(0); - } - else { - m_errorStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : i18n("Unknown unmount error."); - kdDebug() << "medium unmount " << m_errorStr << endl; - error(); - } - } - else if (args->isSet("s") || args->isSet("e")) + unmount(medium); + ::exit(0); + } + else if (args->isSet("k")) { - DCOPRef mediamanager("kded", "mediamanager"); - - /* - * We want to call mediamanager unmount before invoking eject. That's - * because unmount would provide an informative error message in case of - * failure. However, there are cases when unmount would fail - * (supermount, slackware, see bug#116209) but eject would succeed. - * Thus if unmount fails, save unmount error message and invokeEject() - * anyway. Only if both unmount and eject fail, notify the user by - * displaying the saved error message (see ejectFinished()). - */ - TQStringVariantMap unmountResult; - if (medium.isMounted()) - { - DCOPReply reply = mediamanager.call( "unmount", medium.id()); - if (reply.isValid()) { - reply.get(unmountResult); - if (unmountResult["result"].toBool()) { - reply.get(m_errorStr); - } - } - } - - // If this is an unlocked encrypted volume and there is no error yet, we try to lock it - if (unmountResult.contains("result") && unmountResult["result"].toBool() && - medium.isEncrypted() && !medium.clearDeviceUdi().isNull()) - { - DCOPReply reply = mediamanager.call( "undecrypt", medium.id()); - if (reply.isValid()) { - TQStringVariantMap undecryptResult; - reply.get(undecryptResult); - if (undecryptResult["result"].toBool()) { - reply.get(m_errorStr); - } - } - } - - if (m_errorStr.isNull()) { - invokeEject(device, true); - } - else { - error(); - } + unlock(medium); + // No call to ::exit() here because this will open up the password dialog + // ::exit() is handled in the invoked code. + } + else if (args->isSet("l")) + { + lock(medium); + ::exit(0); + } + else if (args->isSet("e")) + { + eject(medium); + ::exit(0); + } + else if (args->isSet("s")) + { + safeRemoval(medium); + ::exit(0); + } + else if (args->isSet("f")) + { + openRealFolder(medium); + ::exit(0); } else { - DCOPRef mediamanager("kded", "mediamanager"); - DCOPReply reply = mediamanager.call("mount", medium.id()); - TQStringVariantMap mountResult; - if (reply.isValid()) { - reply.get(mountResult); - } - if (mountResult.contains("result") && mountResult["result"].toBool()) { - ::exit(0); - } - else { - m_errorStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : i18n("Unknown mount error."); - error(); - } + TDECmdLineArgs::usage(); + ::exit(0); } } -void MountHelper::invokeEject(const TQString &device, bool quiet) +MountHelper::~MountHelper() { -#ifdef __TDE_HAVE_TDEHWLIB - // Try TDE HW library eject first... - TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); - TDEGenericDevice *hwdevice = hwdevices->findByDeviceNode(device); - if (hwdevice->type() == TDEGenericDeviceType::Disk) { - TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(hwdevice); - if (sdevice->ejectDrive()) { - // Success! - ::exit(0); - } - } -#endif - - // Then fall back to tdeeject if needed - TDEProcess *proc = new TDEProcess(TQT_TQOBJECT(this)); - *proc << "tdeeject"; - if (quiet) + if (m_dialog) { - *proc << "-q"; + delete m_dialog; } - *proc << device; - connect( proc, TQT_SIGNAL(processExited(TDEProcess *)), - this, TQT_SLOT( ejectFinished(TDEProcess *) ) ); - proc->start(); } -void MountHelper::ejectFinished(TDEProcess* proc) +void MountHelper::ejectFinished(TDEProcess *proc) { - /* - * If eject failed, report the error stored in m_errorStr - */ + //If eject failed, report the error stored in m_errorStr if (proc->normalExit() && proc->exitStatus() == 0) { ::exit(0); - } else { - if (m_errorStr.isEmpty()) { - if (m_isCdrom) - m_errorStr = i18n("The device was successfully unmounted, but the tray could not be opened"); - else - m_errorStr = i18n("The device was successfully unmounted, but could not be ejected"); + } + else { + if (!m_errorStr.isEmpty()) { + errorAndExit(); } -//X Comment this because the error is useless as long as the unmount is successful. -//X TQTimer::singleShot(0, this, TQT_SLOT(error())); - ::exit(0); + ::exit(0); } } @@ -262,25 +281,28 @@ void MountHelper::error() } } KMessageBox::error(0, prettyErrorString); +} + +void MountHelper::errorAndExit() +{ + error(); ::exit(1); } void MountHelper::slotSendPassword() { DCOPRef mediamanager("kded", "mediamanager"); - - DCOPReply reply = mediamanager.call( "decrypt", m_mediumId, dialog->getPassword() ); - TQStringVariantMap decryptResult; + DCOPReply reply = mediamanager.call("unlock", m_mediumId, m_dialog->getPassword()); + TQStringVariantMap unlockResult; if (reply.isValid()) { - reply.get(decryptResult); + reply.get(unlockResult); } - if (decryptResult.contains("result") && decryptResult["result"].toBool()) { + if (unlockResult.contains("result") && unlockResult["result"].toBool()) { ::exit(0); } else { - m_errorStr = decryptResult.contains("errStr") ? decryptResult["errStr"].toString() : i18n("Unknown decrypt error."); - kdDebug() << "medium decrypt " << m_errorStr << endl; - emit signalPasswordError(m_errorStr); + m_errorStr = unlockResult.contains("errStr") ? unlockResult["errStr"].toString() : i18n("Unknown unlock error."); + kdDebug() << "medium unlock " << m_errorStr << endl; error(); } } @@ -292,12 +314,14 @@ void MountHelper::slotCancel() static TDECmdLineOptions options[] = { - { "d", I18N_NOOP("Decrypt given URL"), 0 }, + { "m", I18N_NOOP("Mount given URL"), 0 }, { "u", I18N_NOOP("Unmount given URL"), 0 }, - { "m", I18N_NOOP("Mount given URL (default)"), 0 }, - { "e", I18N_NOOP("Eject given URL via tdeeject"), 0}, - { "s", I18N_NOOP("Unmount and Eject given URL (necessary for some USB devices)"), 0}, - {"!+URL", I18N_NOOP("media:/ URL to mount/unmount/eject/remove"), 0 }, + { "k", I18N_NOOP("Unlock given URL"), 0 }, + { "l", I18N_NOOP("Lock given URL"), 0 }, + { "e", I18N_NOOP("Eject given URL"), 0}, + { "s", I18N_NOOP("Safely remove (unmount and eject) given URL"), 0}, + { "f", I18N_NOOP("Open real medium folder"), 0}, + {"!+URL", I18N_NOOP("media:/URL to mount/unmount/unlock/lock/eject/remove"), 0 }, TDECmdLineLastOption }; @@ -308,13 +332,15 @@ int main(int argc, char **argv) "tdeio_media_mounthelper", "tdeio_media_mounthelper", "0.1"); - TDECmdLineArgs::addCmdLineOptions( options ); + TDECmdLineArgs::addCmdLineOptions(options); TDEGlobal::locale()->setMainCatalogue("tdeio_media"); TDEApplication::addCmdLineOptions(); + if (TDECmdLineArgs::parsedArgs()->count()==0) + { + TDECmdLineArgs::usage(); + } - if (TDECmdLineArgs::parsedArgs()->count()==0) TDECmdLineArgs::usage(); - TDEApplication *app = new MountHelper(); - + TDEApplication *app = new MountHelper(); TDEStartupInfo::appStarted(); app->dcopClient()->attach(); return app->exec(); diff --git a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.h b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.h index 97df6b7e8..3cdf58488 100644 --- a/tdeioslave/media/mounthelper/tdeio_media_mounthelper.h +++ b/tdeioslave/media/mounthelper/tdeio_media_mounthelper.h @@ -1,5 +1,5 @@ /* This file is part of the KDE project - Copyright (c) 2004 Kévin Ottens <ervin ipsquad net> + Copyright (c) 2004 Kévin Ottens <ervin ipsquad net> Parts of this file are Copyright 2003 Waldo Bastian <bastian@kde.org> @@ -29,29 +29,37 @@ #include "medium.h" class Dialog; +class TDEProcess; class MountHelper : public TDEApplication { - Q_OBJECT + TQ_OBJECT + public: MountHelper(); + ~MountHelper(); private: - const Medium findMedium(const KURL &url); - void invokeEject(const TQString &device, bool quiet=false); TQString m_errorStr; - bool m_isCdrom; TQString m_mediumId; - Dialog *dialog; + Dialog *m_dialog; + + const Medium findMedium(const TQString &device); + void error(); + + void mount(const Medium &medium); + void unmount(const Medium &medium); + void unlock(const Medium &medium); + void lock(const Medium &medium); + void eject(const Medium &medium); + void safeRemoval(const Medium &medium); + void openRealFolder(const Medium &medium); private slots: void slotSendPassword(); void slotCancel(); void ejectFinished(TDEProcess* proc); - void error(); - -signals: - void signalPasswordError(TQString errorMsg); + void errorAndExit(); }; #endif diff --git a/tdeioslave/media/mounthelper/unlockdialog.ui b/tdeioslave/media/mounthelper/unlockdialog.ui index 99a46a9ac..7b78cdb42 100644 --- a/tdeioslave/media/mounthelper/unlockdialog.ui +++ b/tdeioslave/media/mounthelper/unlockdialog.ui @@ -107,7 +107,7 @@ </property> <property name="text"> <string><p><b>%1</b> is an encrypted storage device.</p> -<p>Please enter the password to decrypt the storage device.</p></string> +<p>Please enter the password to unlock the storage device.</p></string> </property> <property name="alignment"> <set>WordBreak|AlignTop</set> @@ -155,46 +155,6 @@ </widget> </hbox> </widget> - <widget class="TQGroupBox" row="2" column="0"> - <property name="name"> - <cstring>errorBox</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>3</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Error</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="TQLabel" row="0" column="0"> - <property name="name"> - <cstring>errorLabel</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>3</hsizetype> - <vsizetype>3</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string></string> - </property> - <property name="alignment"> - <set>WordBreak|AlignTop</set> - </property> - </widget> - </grid> - </widget> </grid> </widget> <layoutdefaults spacing="6" margin="11"/> |