Resim Cakismasi Problemi
-
Merhaba,
Uygulamada her combobox secenegini, bir resim dosyasina baglamaya calistim. Ancak, herhangi bir combobox itemini sectigim zaman, gelen her resim, onceki tercihe ait olan resmin ustune geliyor. Bence, hayatina son vermem gereken dinamik nesnelerden kaynaklaniyor ama sinama isleminde problemim var sanirim. O yuzden erisemiyorum o nesnelere. (Uygulamayi QCreator da yaptim ve sadece combobox, lineedit ve qgraphicsview neesneleri iceriyor)
Baglama isini de Signal-Slot ile yapabilir miyim?
Ayrica, bu uygulamanin tasarimiyla ilgili fikirlerinizi de belirtirseniz cok memnun olurum...
Tesekkurler,
@//main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();return a.exec();
}
@@//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{
Q_OBJECTpublic:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();private slots:
void on_comboBox_currentIndexChanged(int index);private:
Ui::MainWindow *ui;
QGraphicsScene *scene;
QGraphicsView *view;
};#endif // MAINWINDOW_H
@@//mainwindow.cpp
#include <QGridLayout>
#include <QGraphicsItem>
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(ui->centralWidget);
view = new QGraphicsView(scene);
QGridLayout *gLayout = new QGridLayout(ui->centralWidget);
QVBoxLayout *vLayout = new QVBoxLayout();
gLayout -> addWidget(ui->comboBox,0,0,1,2);
gLayout -> addLayout(vLayout, 1,0,3,2);
gLayout ->addWidget(view,0,2,3,3);ui->lineEdit->setEnabled(false); ui->lineEdit_2->setEnabled(false); ui->lineEdit_3->setEnabled(false);
}
MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::on_comboBox_currentIndexChanged(int index)
{
QGraphicsPixmapItem *item;if(index == 0){ ui->lineEdit->hide(); ui->lineEdit_2->hide(); ui->lineEdit_3->hide(); item = new QGraphicsPixmapItem(QPixmap("C:\\....JPG")); scene->addItem(item); view->show();} else if(index == 1) { ui->lineEdit->show(); ui->lineEdit_2->show(); ui->lineEdit_3->hide(); ui->lineEdit->setEnabled(true); ui->lineEdit_2->setEnabled(true); item= new QGraphicsPixmapItem(QPixmap("C:\\....JPG")); scene->addItem(item); view->show();} else if(index == 2){ ui->lineEdit->show(); ui->lineEdit_2->hide(); ui->lineEdit_3->hide(); ui->lineEdit->setEnabled(true); item = new QGraphicsPixmapItem(QPixmap("C:\\....JPG")); scene->addItem(item); view->show();}
}
@ -
Signal - Slot mekanizmasini detayli incelemeni tavsiye ederim. Qt'un en can alici meselelerinden biri ve iyi kavranmasi gerekir.
Signal - Slot mekanizmasinin kriteri signal ve slot'larin parametre uyumudur. Signal'in uyarti verme sekli (signal fonksiyonunun parametresi) slot'un uyarilma sekli (slot fonksiyonunun parametresi) ile uyumlu olmak zorunda. Parametre almayan bir fonksiyon dogal olarak gelen degeri umursamayacagi icin parametre almayan slot'ta her turlu signal tarafindan tetiklenebilir.QComboBox ve QGraphicsView ontanimli olarak burda isine yarayabilecek uyumlu hicbir signal/slot ikilisinde bulusmuyorlar diye biliyorum. Yani sorunun cevabi bildigim kadariyla boylece hayir. Ama kendi signal ve slotunu yazarsan durum degisebilir.
Her new'in bir delete'i vardir. Buna ozen gostermeli, heap'te cop biriktirmemelisin. New'i de delete'i de yerinde ve dogru kullanmalisin. Bu C++.
@if(!(scene->items().isEmpty())) {scene->removeItem(item);}
if(item!=0x0) {delete item;}
item = new QGraphicsPixmapItem(QPixmap("konum"));
scene->addItem(item);@- satir isin icinde item var mi bakar varsa kaldirir (tam aradigin sey), 2. satir item daha once kurulduysa (ki adresi 0x0 degildir) yok eder, gerisi bizim cocuklar.