Nhờ tư vấn - Nhờ giúp đỡ về Qt Creator cơ bản | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

If possible, please support us by clicking on the advertisements.

Please add vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Nhờ tư vấn Nhờ giúp đỡ về Qt Creator cơ bản

thucduy

Búa Gỗ
Tình hình là em có bài tập cuối kì về tạo 1 game đơn giản,em đã làm ra trò chơi bên console nhưng em muốn thiết kế giao diện nên là có tìm hiểu và biết về Qt Creator. Em gặp khá nhiều chỗ không hiểu nên em đăng bài muốn được mọi người giúp đỡ.
Em muốn tạo 1 game đơn giản là trả lời câu hỏi được lấy từ file rồi hiển thị kết quả. Em đang sử dụng Qt Creator để tạo giao diện nhưng mà bị lỗi ở chỗ em không biết đọc dữ liệu từ file và áp dụng nó vào lệch click trên Qt. Mong được giúp đỡ
Untitled.jpg
 

NgoHungCuong


Junior Moderator
Thành viên BQT
Tình hình là em có bài tập cuối kì về tạo 1 game đơn giản,em đã làm ra trò chơi bên console nhưng em muốn thiết kế giao diện nên là có tìm hiểu và biết về Qt Creator. Em gặp khá nhiều chỗ không hiểu nên em đăng bài muốn được mọi người giúp đỡ.
Em muốn tạo 1 game đơn giản là trả lời câu hỏi được lấy từ file rồi hiển thị kết quả. Em đang sử dụng Qt Creator để tạo giao diện nhưng mà bị lỗi ở chỗ em không biết đọc dữ liệu từ file và áp dụng nó vào lệch click trên Qt. Mong được giúp đỡ
Untitled.jpg
Có nhất thiết phải dùng qt ko bạn? Bạn có thể nêu rõ yêu cầu của đề bài hơn?
 

dammage

Rìu Chiến
Tình hình là em có bài tập cuối kì về tạo 1 game đơn giản,em đã làm ra trò chơi bên console nhưng em muốn thiết kế giao diện nên là có tìm hiểu và biết về Qt Creator. Em gặp khá nhiều chỗ không hiểu nên em đăng bài muốn được mọi người giúp đỡ.
Em muốn tạo 1 game đơn giản là trả lời câu hỏi được lấy từ file rồi hiển thị kết quả. Em đang sử dụng Qt Creator để tạo giao diện nhưng mà bị lỗi ở chỗ em không biết đọc dữ liệu từ file và áp dụng nó vào lệch click trên Qt. Mong được giúp đỡ
Untitled.jpg
nếu là do bạn không biết thì không gọi là lỗi được, bạn cứ viết hàm đọc dữ liệu từ file, xong gán dữ liệu đó cho thuộc tính của mấy cái widget là xong mà

tui không xài qt, định cài thử viết demo dùm bạn mà ba thứ đồ quỷ này tốn tời gian quá, xài tạm 1 trình tương tự là borland c++ builder 6

1/dữ liệu của tui đơn giản thôi, cái cb6 này là hàng cũ rồi nên chưa hỗ trợ unicode
-chau nao nho nhat the gioi?
chau my
chau phi
chau doc
-con huu cao co co cai co cao cao la con gi
con huu cao co
con trau
con khi
-ai la nguoi kham pha ra luc hap dan
michael faraday
ian mcKellen
isaar newton
-cai gi co dau ma khong co duoi
cai nha
cai cau
cai xe
-song dai nhat the gioi la song gi
song nile
song amazon
song mississippi

2/form của tui có 5 control (trong qt gọi là widget)
một label để chứa nội dung câu hỏi
3 radiobutton để chứa câu trả lời
1 nút click để kiểm tra và đi tới câu kế
Untitled.jpg


3/tại form create (là lúc form mới tạo), tui gọi hàm đọc dữ liệu từ file, sau đó gán nội dung câu hỏi cho caption của label, gán nội dung đáp án 1, 2, 3 cho caption của các radiobutton1, 2, 3
Mã:
int cauHienTai = 0;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        DocFile();

        Label1->Caption = cauHoi[cauHienTai].cauHoi;
        RadioButton1->Caption = cauHoi[cauHienTai].traloi[0];
        RadioButton2->Caption = cauHoi[cauHienTai].traloi[1];
        RadioButton3->Caption = cauHoi[cauHienTai].traloi[2];
}

tại button click, tui gọi hàm kiểm tra đúng sai, tiếp theo kiểm tra coi có phải câu cuối chưa, nếu là câu cuối thì hiện thông báo số câu đúng, nếu chưa thì tiếp tục load dữ liệu câu kế cho các control
Mã:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(KiemTraDung())
                soCauDung++;

        cauHienTai++;
        if(cauHienTai >= MAXCAUHOI)
        {
                if(Application->MessageBoxA("ban da tra doi dung" + soCauDung, "Finish", MB_YESNO) == MB_NO)
                        PostQuitMessage(0);
                else
                {
                        soCauDung = 0;
                        cauHienTai = 0;
                }
        }

        Label1->Caption = cauHoi[cauHienTai].cauHoi;
        RadioButton1->Caption = cauHoi[cauHienTai].traloi[0];
        RadioButton2->Caption = cauHoi[cauHienTai].traloi[1];
        RadioButton3->Caption = cauHoi[cauHienTai].traloi[2];
}

chạy thử
Untitled.jpg


viết cái demo đơn giản thôi, còn các chức năng cụ thể bạn tự cài đặt nha
 
Sửa lần cuối:

thucduy

Búa Gỗ
Có nhất thiết phải dùng qt ko bạn? Bạn có thể nêu rõ yêu cầu của đề bài hơn?
không nhất thiết phải dùng Qt, ở đây em chỉ muốn tạo 1 giao diện đơn giản để hiển thị nội dung câu hỏi và đếm số câu đúng thôi ạ, bác có thể giúp em làm bên nào cũng được miễn là tạo ra giao diện thôi ạ
 

thucduy

Búa Gỗ
nếu là do bạn không biết thì không gọi là lỗi được, bạn cứ viết hàm đọc dữ liệu từ file, xong gán dữ liệu đó cho thuộc tính của mấy cái widget là xong mà

tui không xài qt, định cài thử viết demo dùm bạn mà ba thứ đồ quỷ này tốn tời gian quá, xài tạm 1 trình tương tự là borland c++ builder 6

1/dữ liệu của tui đơn giản thôi, cái cb6 này là hàng cũ rồi nên chưa hỗ trợ unicode


2/form của tui có 5 control (trong qt gọi là widget)
một label để chứa nội dung câu hỏi
3 radiobutton để chứa câu trả lời
1 nút click để kiểm tra và đi tới câu kế
Untitled.jpg


3/tại form create (là lúc form mới tạo), tui gọi hàm đọc dữ liệu từ file, sau đó gán nội dung câu hỏi cho caption của label, gán nội dung đáp án 1, 2, 3 cho caption của các radiobutton1, 2, 3
Mã:
int cauHienTai = 0;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        DocFile();

        Label1->Caption = cauHoi[cauHienTai].cauHoi;
        RadioButton1->Caption = cauHoi[cauHienTai].traloi[0];
        RadioButton2->Caption = cauHoi[cauHienTai].traloi[1];
        RadioButton3->Caption = cauHoi[cauHienTai].traloi[2];
}

tại button click, tui gọi hàm kiểm tra đúng sai, tiếp theo kiểm tra coi có phải câu cuối chưa, nếu là câu cuối thì hiện thông báo số câu đúng, nếu chưa thì tiếp tục load dữ liệu câu kế cho các control
Mã:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(KiemTraDung())
                soCauDung++;

        cauHienTai++;
        if(cauHienTai >= MAXCAUHOI)
        {
                if(Application->MessageBoxA("ban da tra doi dung" + soCauDung, "Finish", MB_YESNO) == MB_NO)
                        PostQuitMessage(0);
                else
                {
                        soCauDung = 0;
                        cauHienTai = 0;
                }
        }

        Label1->Caption = cauHoi[cauHienTai].cauHoi;
        RadioButton1->Caption = cauHoi[cauHienTai].traloi[0];
        RadioButton2->Caption = cauHoi[cauHienTai].traloi[1];
        RadioButton3->Caption = cauHoi[cauHienTai].traloi[2];
}

chạy thử
Untitled.jpg


viết cái demo đơn giản thôi, còn các chức năng cụ thể bạn tự cài đặt nha
bác có thể cho em xin nguyên bài mẫu này k ạ
 

NgoHungCuong


Junior Moderator
Thành viên BQT
Đọc dữ liệu từ file thì trước tiên bạn cần xác định cấu trúc file câu hỏi: ví dụ dòng đầu tiên là số lượng câu hỏi trong file, đối với mỗi câu hỏi thì 4 dòng đầu là các phương án a, b, c, d và dòng thứ 5 là phương án đúng...
Sau khi có được cấu trúc file câu hỏi thì bạn đọc file bằng các hàm như fgets, fscanf...
Muốn đưa giá câu hỏi vào giao diện thì bạn có thể dùng dialog chẳng hạn, muốn thay đổi text của control thì dùng SetWindowText hoặc SetDlgItemText...
 

thucduy

Búa Gỗ
em đã đọc file và cho nó vào 1 mảng nhưng với class đã khởi tạo thì em thực hiện sai, em thử với
mảng QString đơn giản thì nó load file bình thường, mọi người có thể tìm giúp em lỗi k ạ
line2.jpg
line.jpg
 

dammage

Rìu Chiến
em đã đọc file và cho nó vào 1 mảng nhưng với class đã khởi tạo thì em thực hiện sai, em thử với
mảng QString đơn giản thì nó load file bình thường, mọi người có thể tìm giúp em lỗi k ạ
line2.jpg
line.jpg
bạn tiếp thu cái vụ load dữ liệu lên control nhanh đó, dễ mà phải hông
7L1XX2F.gif


post này tui hông hiểu bạn muốn nói cái gì luôn, phải ngồi nhìn hình đoán ý, theo tui hiểu thì bạn muốn biết tại sao cửa sổ thứ 2 lại không hiện nội dung câu hỏi như cửa sổ 1 đúng hong, nếu vậy thì hình như sai ở chỗ hàm click
ui->label->settext(question->getA());
cái label chứa câu hỏi thì phải là question->getCauhoi() mới đúng chứ
 

thucduy

Búa Gỗ
bạn tiếp thu cái vụ load dữ liệu lên control nhanh đó, dễ mà phải hông
7L1XX2F.gif


post này tui hông hiểu bạn muốn nói cái gì luôn, phải ngồi nhìn hình đoán ý, theo tui hiểu thì bạn muốn biết tại sao cửa sổ thứ 2 lại không hiện nội dung câu hỏi như cửa sổ 1 đúng hong, nếu vậy thì hình như sai ở chỗ hàm click
ui->label->settext(question->getA());
cái label chứa câu hỏi thì phải là question->getCauhoi() mới đúng chứ
em cảm ơn bác nhiều, em sửa lại rồi, em bị ngu đoạn ngớ ngẩn quá :v, em cũng thêm nút Back để quay lại câu trước rồi, cảm ơn bác rất nhiều
 

thucduy

Búa Gỗ
Cho em hỏi thêm là mỗi lần build thì ô radio button hiện sẵn, và mỗi lần click next thì lựa chọn cũ ở ô radio button vẫn còn nguyên, em muốn nó xuất hiện sau khi bấm next thì sao ạ, em đang muốn làm thêm câu hỏi dạng đúng/sai với nhập câu trả lời nên muốn đi hỏi ạ
them.jpg
 

dammage

Rìu Chiến
Cho em hỏi thêm là mỗi lần build thì ô radio button hiện sẵn, và mỗi lần click next thì lựa chọn cũ ở ô radio button vẫn còn nguyên, em muốn nó xuất hiện sau khi bấm next thì sao ạ, em đang muốn làm thêm câu hỏi dạng đúng/sai với nhập câu trả lời nên muốn đi hỏi ạ
them.jpg
dễ ẹc, bạn tìm hiểu mấy cái thuộc tính của nó là được

chẳng hạn trong cái c builder 6 của tui đây, nhìn cái bảng các thuộc tính bên trái, bạn thấy 2 thuộc tính visible (ẩn hiện) và checked (được tích chọn)

nếu lúc đầu không muốn radiobutton hiện thì bạn chọn visible là false, xong muốn muốn nhấn nút cho nó hiện ra thì tại hàm click bạn gõ code
RadioButton1->Visible = true;
tương tự cho cái checked, mỗi khi nhấn next xong bạn cho checked bằng false là ok
Untitled.jpg
 

thucduy

Búa Gỗ
dễ ẹc, bạn tìm hiểu mấy cái thuộc tính của nó là được

chẳng hạn trong cái c builder 6 của tui đây, nhìn cái bảng các thuộc tính bên trái, bạn thấy 2 thuộc tính visible (ẩn hiện) và checked (được tích chọn)

nếu lúc đầu không muốn radiobutton hiện thì bạn chọn visible là false, xong muốn muốn nhấn nút cho nó hiện ra thì tại hàm click bạn gõ code
RadioButton1->Visible = true;
tương tự cho cái checked, mỗi khi nhấn next xong bạn cho checked bằng false là ok
Untitled.jpg
em cảm ơn, giờ thì em muốn thay đổi câu hỏi sang dạng câu hỏi trả lời đúng sai và điền câu trả lời, giờ cho em hỏi là muốn thay đổi loại câu hỏi thì mình thực hiện trên Widget này hay phải chuyển sang 1 Widget khác ạ
 

dammage

Rìu Chiến
em cảm ơn, giờ thì em muốn thay đổi câu hỏi sang dạng câu hỏi trả lời đúng sai và điền câu trả lời, giờ cho em hỏi là muốn thay đổi loại câu hỏi thì mình thực hiện trên Widget này hay phải chuyển sang 1 Widget khác ạ
tùy cách bạn thiết kế cái form thôi, linh hoạt mà vận dụng những control có sẵn, câu hỏi dạng đúng sai thì cũng giống như câu hỏi ở trên ngoại trừ chỗ nó chỉ có 2 lựa chọn

nếu là pha trộn nhiều loại câu hỏi thì có thể thiết kế cái form đơn giản như vầy, sau đó ẩn hiện lần lượt các control tùy theo loại câu hỏi thôi

1/hiện 3 nút radio cho các câu hỏi 3 lựa chọn
2/tới câu hỏi đúng sai thì ẩn bớt 1 cái radio, chỉ để lại 2 cái tương ứng với 2 lựa chọn đúng sai thôi
3/tới câu hỏi điền câu trả lời thì cho hiện cái edit, còn bình thường thì ẩn nó đi

đại khái vậy
Untitled.jpg
 

thucduy

Búa Gỗ
tùy cách bạn thiết kế cái form thôi, linh hoạt mà vận dụng những control có sẵn, câu hỏi dạng đúng sai thì cũng giống như câu hỏi ở trên ngoại trừ chỗ nó chỉ có 2 lựa chọn

nếu là pha trộn nhiều loại câu hỏi thì có thể thiết kế cái form đơn giản như vầy, sau đó ẩn hiện lần lượt các control tùy theo loại câu hỏi thôi

1/hiện 3 nút radio cho các câu hỏi 3 lựa chọn
2/tới câu hỏi đúng sai thì ẩn bớt 1 cái radio, chỉ để lại 2 cái tương ứng với 2 lựa chọn đúng sai thôi
3/tới câu hỏi điền câu trả lời thì cho hiện cái edit, còn bình thường thì ẩn nó đi

đại khái vậy
Untitled.jpg
em có đang làm theo nhưng bị chỗ là khi mình click chọn radio nào thì nhấn next ở câu tiếp theo nó vẫn còn, em cũng tìm hiểu cách xóa nhưng em muốn ở đây là qua câu mới thì 3 cái radio button phải chưa được chọn và khi chọn câu hỏi nào rồi back về vẫn còn thấy lựa chọn cũ của mình ạ
loi.jpg
 

dammage

Rìu Chiến
em có đang làm theo nhưng bị chỗ là khi mình click chọn radio nào thì nhấn next ở câu tiếp theo nó vẫn còn, em cũng tìm hiểu cách xóa nhưng em muốn ở đây là qua câu mới thì 3 cái radio button phải chưa được chọn và khi chọn câu hỏi nào rồi back về vẫn còn thấy lựa chọn cũ của mình ạ
loi.jpg
mấy nay bận quá, vừa làm vừa gõ cho bạn nên nhiều khi đọc lướt, nói chung giờ cũng hiểu ý bạn rồi, bạn muốn làm giống mấy cái trắc nghiệm hay gặp đúng hông, nếu vậy thì mô tả của bạn sai rồi, next là đi tới câu kế chứ không hẳn là đi tới câu mới, vì câu kế đó có thể là câu cũ người dùng đã chọn trước đó rồi (next rồi back rồi next thì có phải là đang ở câu cũ hông)

theo tui có thể thêm 1 biến dachon vô question để đánh dấu câu mà người dùng đã chọn, lưu ý code dưới đây chỉ là pseudo code thôi, bạn phải tự cài đặt cụ thể bằng qt
Mã:
class question
{
    QString cauhoi, A, B, C;
    int caudung;
    int dachon = 0;
};
dachon phải được khởi tạo là 0, nghĩa là chưa có đáp án nào được chọn, tiếp, khi người dùng click radio nào thì gán giá trị cho dachon tương ứng
Mã:
on_radioA_clicked()
{
    question[i]->dachon = 1;
}
on_radioB_clicked()
{
    question[i]->dachon = 2;
}
on_radioC_clicked()
{
    question[i]->dachon = 3;
}
tiếp theo, tui viết 1 hàm apply, nó sẽ đọc giá trị của dachon và apply cho các radio
Mã:
void apply()
{
        xóa tình trạng chọn lựa hiện tại
        ui->A->setChecked(false);
        ui->A->setChecked(false);
        ui->A->setChecked(false);

        đọc biến dachon rồi apply cho radio
        if(cauHoi[cauHienTai].dachon == 1)
                ui->A->setChecked(true);
        if(cauHoi[cauHienTai].dachon == 2)
                ui->B->setChecked(true);
        if(cauHoi[cauHienTai].dachon == 3)
                ui->C->setChecked(true);
}
tiếp theo là nút next với back, tương tự nhau
Mã:
on_Next_clicked()
{
    i++;
    load nội dung câu tiếp theo, cái này bạn biết rồi

    apply();
}

on_Back_clicked()
{
    i--;
    load nội dung câu trước đó

    apply();
}

đơn giản như đang giỡn
7L1XX2F.gif
, đây là cái demo tui cài đặt theo hướng ở trên, cũ rồi không biết có chạy được trên win10 hông nữa
https://www.dropbox.com/s/2w3iykgjehqi4w5/Project2.rar
 

thucduy

Búa Gỗ
mấy nay bận quá, vừa làm vừa gõ cho bạn nên nhiều khi đọc lướt, nói chung giờ cũng hiểu ý bạn rồi, bạn muốn làm giống mấy cái trắc nghiệm hay gặp đúng hông, nếu vậy thì mô tả của bạn sai rồi, next là đi tới câu kế chứ không hẳn là đi tới câu mới, vì câu kế đó có thể là câu cũ người dùng đã chọn trước đó rồi (next rồi back rồi next thì có phải là đang ở câu cũ hông)

theo tui có thể thêm 1 biến dachon vô question để đánh dấu câu mà người dùng đã chọn, lưu ý code dưới đây chỉ là pseudo code thôi, bạn phải tự cài đặt cụ thể bằng qt
Mã:
class question
{
    QString cauhoi, A, B, C;
    int caudung;
    int dachon = 0;
};
dachon phải được khởi tạo là 0, nghĩa là chưa có đáp án nào được chọn, tiếp, khi người dùng click radio nào thì gán giá trị cho dachon tương ứng
Mã:
on_radioA_clicked()
{
    question[i]->dachon = 1;
}
on_radioB_clicked()
{
    question[i]->dachon = 2;
}
on_radioC_clicked()
{
    question[i]->dachon = 3;
}
tiếp theo, tui viết 1 hàm apply, nó sẽ đọc giá trị của dachon và apply cho các radio
Mã:
void apply()
{
        xóa tình trạng chọn lựa hiện tại
        ui->A->setChecked(false);
        ui->A->setChecked(false);
        ui->A->setChecked(false);

        đọc biến dachon rồi apply cho radio
        if(cauHoi[cauHienTai].dachon == 1)
                ui->A->setChecked(true);
        if(cauHoi[cauHienTai].dachon == 2)
                ui->B->setChecked(true);
        if(cauHoi[cauHienTai].dachon == 3)
                ui->C->setChecked(true);
}
tiếp theo là nút next với back, tương tự nhau
Mã:
on_Next_clicked()
{
    i++;
    load nội dung câu tiếp theo, cái này bạn biết rồi

    apply();
}

on_Back_clicked()
{
    i--;
    load nội dung câu trước đó

    apply();
}

đơn giản như đang giỡn
7L1XX2F.gif
, đây là cái demo tui cài đặt theo hướng ở trên, cũ rồi không biết có chạy được trên win10 hông nữa
https://www.dropbox.com/s/2w3iykgjehqi4w5/Project2.rar
em cảm ơn bác nhiều ạ, do em mới tập tành làm nên là còn khá ngu ngơ ạ :v
 

thucduy

Búa Gỗ
ở chỗ đếm số câu đúng của em, em đã cho 1 mảng rồi khi radio button được check thì phần tử thứ i được gán bằng 1, ở phần đếm em cho chạy vòng for duyệt mảng rồi khi phần tử nào =1 thì cho socaudung++ nhưng mà thuật toán em bị lỗi chỗ nào rồi ạ, xuất kết quả ra thì bằng đúng số phần tử của mảng
socaudung.jpg
 

dammage

Rìu Chiến
ở chỗ đếm số câu đúng của em, em đã cho 1 mảng rồi khi radio button được check thì phần tử thứ i được gán bằng 1, ở phần đếm em cho chạy vòng for duyệt mảng rồi khi phần tử nào =1 thì cho socaudung++ nhưng mà thuật toán em bị lỗi chỗ nào rồi ạ, xuất kết quả ra thì bằng đúng số phần tử của mảng
socaudung.jpg
cái hàm finish click đó, sao biến chạy của vòng for là dem mà chỗ if lại là
Mã:
dung[i] == 1
vậy bạn, phải là dung[dem] == 1 mới đúng chứ
 

thucduy

Búa Gỗ
cái hàm finish click đó, sao biến chạy của vòng for là dem mà chỗ if lại là
Mã:
dung[i] == 1
vậy bạn, phải là dung[dem] == 1 mới đúng chứ
Cảm ơn bác, lúc trưa em bị ngáo rồi :v viết code ngu quá, chiều xem lại thì sửa lại dem 1 phát ăn ngay :v
 


Top