В этом примере вы сделаете попытку применить виджет QComboBox
и посмотрите, как ведут себя сигналы и слоты с параметрами. Вы создадите класс ComboBox
, потомка QMainWindow
. В нем будут два виджета QComboBox
: один для чтения/записи, другой только для чтения. Вы установите связь с сигналом textChanged
для того, чтобы получать текущее значение при каждом его изменении.
1. Введите следующий программный код и назовите файл ComboBox.h:
#include
#include
class ComboBox : public QMainWindow {
Q_OBJECT
public:
ComboBox(QWidget* parent = 0, const char *name = 0);
private slots:
void Changed(const QString& s);
};
2. Интерфейс состоит из двух виджетов QComboBox
: один редактируемый, а другой предназначен только для чтения. Вы заполните оба списка одними и теми же вариантами:
#include "ComboBox.moс"
#include
#include
ComboBox::ComboBox(QWidget *parent, const char *name) :
QMainWindow(parent, name) {
QWidget *widget = new QWidget(this);
setCentralWidget(widget);
QVBoxLayout *vbox = new QVBoxLayout(widget, 5, 10, "vbox");
QComboBox *editablecombo = new QComboBox(TRUE, widget, "editable");
vbox->addWidget(editablecombo);
QComboBox *readonlycombo = new QComboBox(FALSE, widget, "readonly");
vbox->addWidget(readonlycombo);
static const char* items[] = {"Macbeth", "Twelfth Night", "Othello", 0};
editablecombo->insertStrList(items);
readonlycombo->insertStrList(items);
connect(editablecombo, SIGNAL(textchanged(const QString&),
this, SLOT(Changed(const QString&)));
resize(350, 200);
}
3. Далее приведена функция слота. Обратите внимание на параметр s
типа QString
, передаваемый сигналом:
void ComboBox::Changed(const QString& s) {
std::cout << s << "\n";
}
int main(int argc, char **argv) {
QApplication app(argc, argv);
ComboBox* window = new ComboBox;
app.setMainWidget(window);
window->show;
return app.exec;
}
Вы сможете видеть вновь выбранные из редактируемого QComboBox
варианты в командной строке на рис. 17.6.
Рис. 17.6
Как это работает
Создаются виджеты раскрывающегося списка во многом так же, как и другие виджеты. Главная новая деталь — вызов функции insertStrList
для сохранения списка вариантов в виджете.
Как и в других содержащих текст виджетах, можно задать функцию, которая будет вызываться каждый раз при изменении значения или в общем случае текста раскрывающегося списка.
Списки и деревья в комплекте Qt формируются виджетом QListView
. Этот виджет представляет как простые списки, так и иерархические данные, разделенные на строки и столбцы. Он очень подходит для вывода структур каталогов или чего-то подобного, потому что дочерние элементы можно раскрыть и свернуть, щелкнув кнопкой мыши знак "плюс" или "минус", так же как в файловом обозревателе.
В отличие от виджета GTK+ ListView
виджет QListView
обрабатывает и данные, и их представление, что сделано для облегчения использования, если не для исключительной гибкости.
В виджете QListView
можно выбрать строки или отдельные ячейки и затем вырезать и вставить данные, отсортировать их по столбцу и вы получите виджеты QCheckBox
, отображенные в ячейках. В этот виджет встроено множество функциональных возможностей — как программисту вам достаточно лишь вставить данные и задать некоторые правила форматирования.
Создается виджет QListView
обычным образом, заданием родительского виджета и собственного имени виджета:
QListView *view = new QListView(parent, "name");
Для задания заголовков столбцов используйте соответствующим образом названный метод addColumn
:
view->addColumn("Left Column", width1); // фиксированной ширины
view->addColumn("Right Column"); // с автоматически задаваемым размером