2012-03-14 14 views
6

Soy un programador de estudiantes que usa Qt para crear una tabla de lectores para mi empresa. Este lector es a la vez editor y convertidor. Se lee en un archivo .i permite la edición de tabla de un documento de texto y luego saca un archivo .scf que es esencialmente un archivo de valores separados apilados en una leyenda construida con encabezados. Estoy divagando ... Básicamente, el formato de archivo importado es muy difícil de escanear y leer (casi imposible) así que lo que me gustaría es modificar el archivo abierto preBuilt QFileDialog para incluir un menú desplegable adicional cuando se seleccionen tipos de archivos antiguos para declarar sus encabezados de plantilla.Modificación de QFileDialog :: getOpenFileName para tener un menú desplegable adicional

Cuando el usuario selecciona .i archivos de extensión (opción 2 tipo de archivo) Me gustaría habilitar un menú desplegable adicional para permitirle al usuario seleccionar qué tipo de archivo .i es (plantilla seleccionada). De esta forma no tengo que lidiar con Dios sabe cuántas horas tratando de encontrar una manera de indexar todos los encabezados en la tabla para cada tipo diferente. Actualmente mi función IMPORTFILE llama al diálogo utilizando la siguiente:

QString fileLocation = QFileDialog::getOpenFileName(this,("Open File"), "", ("Simulation Configuration File(*.scf);;Input Files(*.prp *.sze *.i *.I *.tab *.inp *.tbl)")); //launches File Selector 

He estado referenciación QFileDialog Documentation para tratar de encontrar una solución a lo que necesito, pero no han tenido éxito. Gracias por leer mi publicación y gracias de antemano por cualquier dirección que puedan dar sobre esto.

ACTUALIZACIÓN MAR 16 2012; Primero, me gustaría dar las gracias a Masci por su apoyo inicial en este asunto. A continuación se muestra la declaración de conexión que tengo junto con el error que recibo.

//Declared data type 
    QFileDialog openFile; 
    QComboBox comboBoxTemplateSelector; 
    connect(openFile, SIGNAL(currentChanged(const &QString)), this, SLOT(checkTemplateSelected())); 
    openFile.layout()->addWidget(comboBoxTemplateSelector); 

compile errors

También me di cuenta de que no le gustaba la forma añadí la QComboBox a la disposición del diálogo modificado (que es el segundo error). Realmente espero estar haciendo algo tonto aquí y es una tarea fácil de superar.

En respuesta al comentario de tmpearce aquí está mi código de encabezado;

#include <QWidget> 
namespace Ui { 
class ReaderTable; 
} 
class ReaderTable : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit ReaderTable(QWidget *parent = 0); 
    ~ReaderTable(); 
public slots: 
    void checkTemplateSelected(); 
    void importFile(); 
    void saveFile(); 
private: 
    Ui::ReaderTable *ui; 
}; 

Gracias por leer y gracias de antemano por su contribución a este desafío!

+1

¿Hay alguna razón por la que no pueda simplemente comprobar el 'QString' devuelto y, si es necesario, mostrar un segundo cuadro de diálogo con el menú desplegable? Esto (probablemente) sería más sencillo que tratar de modificar QFileDialog para tener la funcionalidad adicional. – tmpearce

+0

Estoy completamente de acuerdo; También creo que eso sería más guía para nuestros clientes, ya que podrían no pensar en verificar los tipos de archivos que pueden mostrarse. Sin embargo, considero que a mi empresa le gustaría hacer que acceder a tipos de archivos antiguos sea un poco difícil para que realmente se extingan lo más rápido posible. Todas las opiniones a un lado; nunca hemos tenido un estándar con estos archivos (por lo que las plantillas seleccionadas son tan necesarias) y esta nueva extensión es un intento de eso. –

+1

Bueno, si quiere hacerlo mientras el cuadro de diálogo de archivo está abierto, eche un vistazo a las señales 'QFileDialog :: fileSelected'. Esto requerirá que no use la función estática 'getOpenFileName'; en su lugar, cree un diálogo usted mismo y conecte esta señal a una ranura desde la que puede abrir el cuadro de diálogo personalizado con el menú desplegable (si se seleccionó ese tipo de archivo), y sucederá cada vez que se haga clic en un elemento. – tmpearce

Respuesta

6

Instale un QFileDialog (no llame al método getOpenFileName estático), acceda a su diseño y agregue un QComboBox deshabilitado.

// mydialog_ and cb_ could be private fields inside MyClass 
mydialog_ = new QFileDialog; 
cb_ = new QComboBox; 
cb_->setEnabled(false); 
connect(mydialog, SIGNAL(currentChanged(const QString&)), this, SLOT(checkFilter(const QString&))); 
mydialog_->layout()->addWidget(cb_); 

if (mydialog_->exec() == QDialog::Accepted) { 
    QString selectedFile = mydialog_->selectedFiles()[0]; 
    QString cbSelection = cb_->currentText(); 
} 

la ranura sería algo así como:

void MyClass::checkFilter(const QString& filter) 
{ 
    cb_->setEnabled(filter == "what_you_want"); 
} 

regresar del ejecutivo de diálogo(), se puede recuperar el archivo seleccionado y cb_ selección actual. Observe que podría agregar algo más complejo que un QComboBox simple en la parte inferior del cuadro de diálogo, cuidando los cosméticos gui.

En realidad, no me gusta mucho este enfoque (pero eso fue lo que solicitó :-).Me gustaría hacer un diálogo sencillo como esto:

enter image description here

y activar el combo sólo si el archivo seleccionado cumple con sus criterios. El botón "examinar" podría llamar al método estático getOpenFileMethod en QFileDialog.

+0

Me gusta esta solución; si funciona depende de si el el diseño maneja el combobox extra (o widget completo) de una manera agradable, y cómo hacer que el usuario realmente seleccione uno de las opciones. Es por eso que sugerí la creación de subclases, pero esto quizás podría funcionar. – tmpearce

+0

@mpemedad de acuerdo. Lo probé con PyQt con una QLabel simple añadida al diálogo, creo que se necesitará algo de trabajo para alinear las cosas, y en cualquier caso los botones "Cancelar" y "Abrir" permanecerían por encima del widget agregado. – Masci

+0

Tengo problemas con la declaración de conexión; Entiendo el concepto, pero no estoy seguro de estar llamando a las cosas correctas. Otro hecho curioso es que el campo SIGNAL no incluye ningún tipo de intellisense, lo que me hace pensar cómo se transmiten las señales aquí. intenté: connect (openFile, SIGNAL (openFile.filterSelected ("Archivos de entrada (* .prp * .sze * .i * .I * .tab * .inp * .tbl)")), esto, SLOT (checkTemplateSelected())); y connect (openFile, SIGNAL (currentChanged (const & QString)), esto, SLOT (checkTemplateSelected())); ¿Algún consejo aquí? –

0

Se puede controlar la selección del artículo por esta señal:
void QFileDialog::fileSelected (const QString & file)
A continuación se presenta, llame setFilter con el tipo que desee.
Lo siento, si no entiendo su tarea.

Cuestiones relacionadas